提交 57fe6797 作者: zhenjie

Merge branch 'develop' of ssh://git.mmcuav.cn:8222/iuav/ims into develop

......@@ -23,8 +23,8 @@ public class TenderApplyDTO implements Serializable {
private Integer id;
@ApiModelProperty(value = "招标快讯编号")
private String tenderInfoNo;
@ApiModelProperty(value = "招标快讯内容")
private String tenderContent;
@ApiModelProperty(value = "招标快讯标题")
private String tenderTitle;
// @ApiModelProperty(value = "用户id")
// private Integer userAccountId;
// @ApiModelProperty(value = "招标快讯id")
......
......@@ -26,6 +26,8 @@ public class TenderInfoDTO implements Serializable {
private Integer tenderNewsId;
@ApiModelProperty(value = "招标快讯内容序号")
private String tenderInfoNo;
@ApiModelProperty(value = "招标快讯标题")
private String tenderTitle;
@ApiModelProperty(value = "招标快讯内容")
private String tenderContent;
@ApiModelProperty(value = "价格")
......
package com.mmc.csf.infomation.qo;
import com.mmc.csf.release.model.group.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class IndustryNewsQO implements Serializable {
private static final long serialVersionUID = -46151544725013257L;
@ApiModelProperty(value = "新闻标题",example = "新闻标题")
private String newsTitle;
@ApiModelProperty(value = "开始时间")
private Date startTime;
@ApiModelProperty(value = "结束时间")
private Date endTime;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true)
@NotNull(message = "每页显示数不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
}
package com.mmc.csf.infomation.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/5/19 11:23
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IndustryNewsDTO implements Serializable {
private static final long serialVersionUID = 8479619142765659138L;
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "新闻标题")
private String newsTitle;
@ApiModelProperty(value = "作者")
private String newsAuthor;
@ApiModelProperty(value = "发布者id")
private Integer userAccountId;
@ApiModelProperty(value = "封面图")
private String surfaceImg;
@ApiModelProperty(value = "新闻内容")
private String newsContents;
@ApiModelProperty(value = "来源")
private String origin;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "最新修改时间")
private Date updateTime;
}
package com.mmc.csf.infomation.vo;
import com.mmc.csf.release.model.group.Create;
import com.mmc.csf.release.model.group.Others;
import com.mmc.csf.release.model.group.Update;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/5/19 11:23
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IndustryNewsVO implements Serializable {
private static final long serialVersionUID = 8479619142765659138L;
@ApiModelProperty(value = "id")
@NotNull(message = "修改id不能为空", groups = {Update.class})
private Integer id;
@ApiModelProperty(value = "新闻标题")
@ApiModelProperty(value = "新闻标题",example = "新闻标题")
@NotBlank(message = "文章标题不能为空",groups = {Create.class,Update.class})
private String newsTitle;
@ApiModelProperty(value = "作者")
@ApiModelProperty(value = "作者",example = "作者")
@NotBlank(message = "作者不能为空",groups = {Create.class,Update.class})
private String newsAuthor;
@ApiModelProperty(value = "发布者id")
@ApiModelProperty(value = "创建人",hidden = true)
private Integer userAccountId;
@ApiModelProperty(value = "封面图")
@NotBlank(message = "封面图不能为空",groups = {Create.class,Update.class})
private String surfaceImg;
@ApiModelProperty(value = "新闻内容")
private String newsContents;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "最新修改时间")
private Date updateTime;
@ApiModelProperty(value = "来源",example = "来源")
private String origin;
}
package com.mmc.csf.infomation.vo;
import com.mmc.csf.release.model.group.Create;
import com.mmc.csf.release.model.group.Freeze;
import com.mmc.csf.release.model.group.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TenderApplyQO implements Serializable {
private static final long serialVersionUID = -5519324350926972959L;
@ApiModelProperty(value = "招标id")
private Integer tenderNewsId;
@ApiModelProperty(value = "招标详情id")
private Integer tenderInfoId;
@ApiModelProperty(value = "用户名",example = "用户名")
private String userName;
@ApiModelProperty(value = "页码")
@NotNull(message = "页码不能为空", groups = { Page.class})
@Min(value = 1, groups = Page.class,message = "pageNo不能少于1")
private Integer pageNo;
@ApiModelProperty(value = "每页显示数")
@NotNull(message = "每页显示数不能为空", groups = { Page.class})
@Min(value = 1, groups = Page.class,message = "pageSize不能少于1")
private Integer pageSize;
}
......@@ -21,7 +21,7 @@ public class TenderApplyVO implements Serializable {
@ApiModelProperty(value = "招标id")
@NotNull(message = "招标id不能为空", groups = {Create.class})
private Integer tenderNewsId;
@ApiModelProperty(value = "用户id")
@ApiModelProperty(value = "用户id",hidden = true)
//@NotNull(message = "用户id不能为空", groups = {Create.class})
private Integer userAccountId;
@ApiModelProperty(value = "招标详情id")
......
package com.mmc.csf.infomation.vo;
import com.mmc.csf.release.model.group.Update;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TenderInfoVO implements Serializable {
private static final long serialVersionUID = -8188835029420792396L;
@NotNull(message = "修改时id不能为空",groups = Update.class)
private Integer id;
@ApiModelProperty(value = "招标快讯标题")
@Length(message = "修改标题不能超过64字符",max = 64,groups = Update.class)
@NotBlank(message = "修改时标题不能为空",groups = Update.class)
private String tenderTitle;
@ApiModelProperty(value = "价格")
private BigDecimal tenderPrice;
@ApiModelProperty(value = "招标快讯内容")
private String tenderContent;
}
......@@ -11,11 +11,14 @@ import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author MMC_hzj
* author:zhenjie
* Date:2022/5/21
* time:16:17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "com.mmc.csf.sharefly.vo.TenderNewsVO", description = "招标快讯内容参数")
public class TenderNewsVO implements Serializable {
private static final long serialVersionUID = -8188835029420792396L;
@ApiModelProperty(value = "id")
......
......@@ -351,7 +351,7 @@ public enum ResultEnum implements BaseErrorInfoInterface {
FILE_PARSE_ERROR("40600", "上传文件无数据或内容识别失败,请重新上传"),
HAS_BEEN_APPLY_ERROR("40601", "已提交申请!将有客服人员与你联系"),
PRICE_TO_HIGH_ERROR("40602", "标价确认在0-10000000万元内"),
PRICE_TO_HIGH_ERROR("40602", "标价确认在0-10000000万元内"),
EXIST_SAME_NAME_ERROR("40603", "快讯名称重复,请重新上传"),
TENDER_FORMAT_ERROR("40604", "招标序号或内容不能为空,请补全后上传"),
TENDER_CONTENT_TOO_LONG_ERROR("40605", "存在招标内容字符过长"),
......@@ -396,7 +396,10 @@ public enum ResultEnum implements BaseErrorInfoInterface {
HELP_FAIL_ERROR("2009", "不能给自己助力哦!"),
ALREADY_BINDING_ERROR("2010", "优惠券已被绑定"),
ALREADY_DIVIDE_ERROR("2011", "订单已分成"),
DIVIDE_OBJ_NOT_EXIST("2012", "先点击确认添加分成对象");
DIVIDE_OBJ_NOT_EXIST("2012", "先点击确认添加分成对象"),
// 新闻行业
INDUSTRY_NEWS_TITLE_EXISTS("40200","文章标题存在");
/**
* 错误码
*
......
......@@ -5,5 +5,5 @@ metadata:
namespace: default
data:
SPRING_PROFILES_ACTIVE: default
SW_AGENT_COLLECTOR_BACKEND_SERVICES: "default-oap.default:11800"
SW_AGENT_COLLECTOR_BACKEND_SERVICES: "default-oap.skywalking-swck-system:11800"
SW_AGENT_NAME: ims
......@@ -22,6 +22,9 @@ spec:
volumeMounts:
- name: log-of-app
mountPath: /var/log/app
- name: localtime
mountPath: /etc/localtime
readOnly: true
resources:
limits:
memory: 1024Mi
......@@ -47,4 +50,7 @@ spec:
volumes:
- name: log-of-app
hostPath:
path: /var/log/app
\ No newline at end of file
path: /var/log/app
- name: localtime
hostPath:
path: /etc/localtime
\ No newline at end of file
......@@ -18,4 +18,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/ims
newTag: c589555fceeca9833256d7f3a181015caf5f36c5
newTag: d6ab78c5efde0e3ef645a9f581afd501443b0fb0
......@@ -2,9 +2,12 @@ package com.mmc.csf.release.controller;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.vo.IndustryCaseVO;
import com.mmc.csf.infomation.qo.IndustryNewsQO;
import com.mmc.csf.infomation.vo.IndustryNewsDTO;
import com.mmc.csf.infomation.vo.IndustryNewsVO;
import com.mmc.csf.release.model.group.Create;
import com.mmc.csf.release.model.group.Page;
import com.mmc.csf.release.model.group.Update;
import com.mmc.csf.release.service.IndustryNewsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -13,31 +16,51 @@ import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zj
* @Date: 2023/5/19 10:42
*/
@Api(tags = {"行业新闻相关"})
@Api(tags = {"行业新闻-相关接口"})
@RestController
@RequestMapping("/industry-news/")
public class IndustryNewsController {
public class IndustryNewsController extends BaseController {
@Autowired
private IndustryNewsService industryNewsService;
@ApiOperation(value = "新闻列表")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = IndustryNewsVO.class) })
@PostMapping("listNewsPage")
public ResultBody listNewsPage(@Validated(value = {Page.class})@RequestBody IndustryCaseQO industryCaseQO, HttpServletRequest request){
return industryNewsService.listNewsPage(industryCaseQO, request);
@ApiOperation(value = "添加-行业新闻")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@PostMapping("insertIndustryNews")
public ResultBody insertIndustryNews(@RequestBody @Validated(Create.class) IndustryNewsVO industryNewsVO, HttpServletRequest request){
return industryNewsService.insertIndustryNews(industryNewsVO, this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
@ApiOperation(value = "修改-行业新闻")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@PostMapping("upDateIndustryNews")
public ResultBody upDateIndustryNews(@RequestBody @Validated(Update.class) IndustryNewsVO industryNewsVO, HttpServletRequest request){
return industryNewsService.upDateIndustryNews(industryNewsVO, this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
@ApiOperation(value = "新闻详情")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = IndustryNewsVO.class) })
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = IndustryNewsDTO.class) })
@GetMapping("details")
public ResultBody details(@RequestParam Integer id){
public ResultBody<IndustryNewsDTO> details(@RequestParam Integer id){
return industryNewsService.details(id);
}
@ApiOperation(value = "后台-新闻列表")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = IndustryNewsDTO.class) })
@PostMapping("backgroundListNewsPage")
public ResultBody<IndustryNewsDTO> backgroundListNewsPage(@Validated(value = {Page.class})@RequestBody IndustryNewsQO industryNewsQO, HttpServletRequest request){
return industryNewsService.backgroundListNewsPage(industryNewsQO, request);
}
@ApiOperation(value = "web端-新闻列表")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = IndustryNewsDTO.class) })
@PostMapping("listNewsPage")
public ResultBody<IndustryNewsDTO> listNewsPage(@Validated(value = {Page.class})@RequestBody IndustryCaseQO industryCaseQO, HttpServletRequest request){
return industryNewsService.listNewsPage(industryCaseQO, request);
}
}
......@@ -2,7 +2,8 @@ package com.mmc.csf.release.controller;
import com.mmc.csf.common.util.group.Create;
import com.mmc.csf.common.util.group.Page;
import com.mmc.csf.common.util.group.Update;
import com.mmc.csf.infomation.vo.TenderApplyQO;
import com.mmc.csf.release.model.group.Update;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.infomation.dto.AppTenderInfoDTO;
import com.mmc.csf.infomation.dto.TenderApplyDTO;
......@@ -10,12 +11,10 @@ import com.mmc.csf.infomation.dto.TenderInfoDTO;
import com.mmc.csf.infomation.dto.TenderNewsDTO;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.vo.TenderApplyVO;
import com.mmc.csf.infomation.vo.TenderInfoVO;
import com.mmc.csf.infomation.vo.TenderNewsVO;
import com.mmc.csf.release.service.TenderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -23,7 +22,6 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
/**
......@@ -38,7 +36,7 @@ public class TenderController extends BaseController{
@Autowired
private TenderService tenderService;
@ApiOperation(value = "新增招标快讯", hidden = true)
@ApiOperation(value = "新增招标快讯")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping(value = "news")
public ResultBody addTenderNews(@RequestPart(value = "file") MultipartFile file,
......@@ -47,10 +45,10 @@ public class TenderController extends BaseController{
return tenderService.addTenderNews(file, tenderNewsVO);
}
@ApiOperation(value = "查询招标快讯列表-分页", hidden = true)
@ApiOperation(value = "查询招标快讯列表-分页")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = TenderNewsDTO.class)})
@GetMapping(value = "news")
public ResultBody listTenderNews(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
public ResultBody<TenderNewsDTO> listTenderNews(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
@RequestParam(value = "tenderName", required = false) String tenderName,
@RequestParam(value = "startTime", required = false) Date startTime,
@RequestParam(value = "endTime", required = false) Date endTime,
......@@ -58,7 +56,7 @@ public class TenderController extends BaseController{
return tenderService.listTenderNews(pageNo, pageSize, tenderName, startTime, endTime, using);
}
@ApiOperation(value = "修改招标快讯列表", hidden = true)
@ApiOperation(value = "修改-招标快讯列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PutMapping(value = "news")
public ResultBody updateTenderNews(@RequestParam(value = "file", required = false) MultipartFile file,
......@@ -66,14 +64,14 @@ public class TenderController extends BaseController{
return tenderService.updateTenderNews(file, tenderNewsVO);
}
@ApiOperation(value = "删除查询招标快讯", hidden = true)
@ApiOperation(value = "删除招标快讯")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@DeleteMapping(value = "news/{id}")
public ResultBody removeTenderNews(@PathVariable("id") Integer id){
return tenderService.removeTenderNews(id);
}
@ApiOperation(value = "查询招标快讯详情列表-分页", hidden = true)
@ApiOperation(value = "查询-招标快讯详情列表-分页")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = TenderInfoDTO.class)})
@GetMapping(value = "info")
public ResultBody listTenderInfo(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
......@@ -81,13 +79,11 @@ public class TenderController extends BaseController{
return tenderService.listTenderInfo(pageNo, pageSize, tenderNewsId);
}
@ApiOperation(value = "修改招标快讯详情", hidden = true)
@ApiOperation(value = "修改-招标快讯详情")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PutMapping(value = "info")
public ResultBody updateTenderInfo(@RequestParam(value = "id", required = true) Integer id,
@RequestParam(value = "tenderContent", required = true) String tenderContent,
@RequestParam(required = false)BigDecimal tenderPrice){
return tenderService.updateTenderInfo(id, tenderContent, tenderPrice);
public ResultBody updateTenderInfo(@Validated(value = Update.class) @RequestBody TenderInfoVO tenderInfoVO){
return tenderService.updateTenderInfo(tenderInfoVO);
}
@ApiOperation(value = "合作申请提交")
......@@ -98,24 +94,21 @@ public class TenderController extends BaseController{
return tenderService.addTenderApply(tenderApplyVO, request);
}
@ApiOperation(value = "用户反馈列表-分页", hidden = true)
@ApiOperation(value = "用户反馈列表-分页")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = TenderApplyDTO.class)})
@GetMapping(value = "apply")
public ResultBody listTenderApply(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
@RequestParam Integer tenderNewsId, @RequestParam(required = false) Integer tenderInfoId,
@RequestParam(required = false) String keyword){
return tenderService.listTenderApply(pageNo, pageSize, tenderNewsId, tenderInfoId, keyword);
@PostMapping(value = "applyList")
public ResultBody listTenderApply(@RequestBody TenderApplyQO tenderApplyQO){
return tenderService.listTenderApply(tenderApplyQO);
}
@ApiOperation(value = "app往期招标快讯详情列表-分页", hidden = true)
@ApiOperation(value = "web端-招投标列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = AppTenderInfoDTO.class)})
@GetMapping(value = "info/app")
public ResultBody listTenderInfoApp(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
@RequestParam Integer tenderNewsId, @RequestParam(required = false) Integer userAccountId){
return tenderService.listTenderInfoApp(pageNo, pageSize, tenderNewsId, userAccountId);
@PostMapping(value = "listNewTenderInfo")
public ResultBody listNewTenderInfo(@Validated(value = {Page.class})@RequestBody IndustryCaseQO industryCaseQO, HttpServletRequest request){
return tenderService.listNewTenderInfo(industryCaseQO, this.getUserLoginInfoFromRedis(request), request);
}
@ApiOperation(value = "app最新招标快讯详情列表-分页", hidden = true)
@ApiOperation(value = "app最新招标快讯详情列表-分页")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = AppTenderInfoDTO.class)})
@GetMapping(value = "info/app/latest")
public ResultBody listTenderInfoAppLatest(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
......@@ -123,11 +116,11 @@ public class TenderController extends BaseController{
return tenderService.listTenderInfoAppLatest(pageNo, pageSize, userAccountId);
}
@ApiOperation(value = "招投标列表")
@ApiOperation(value = "app往期招标快讯详情列表-分页",hidden = true)
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = AppTenderInfoDTO.class)})
@PostMapping(value = "listNewTenderInfo")
public ResultBody listNewTenderInfo(@Validated(value = {Page.class})@RequestBody IndustryCaseQO industryCaseQO, HttpServletRequest request){
return tenderService.listNewTenderInfo(industryCaseQO, this.getUserLoginInfoFromRedis(request), request);
@GetMapping(value = "info/app")
public ResultBody listTenderInfoApp(@RequestParam Integer pageNo, @RequestParam Integer pageSize,
@RequestParam Integer tenderNewsId, @RequestParam(required = false) Integer userAccountId){
return tenderService.listTenderInfoApp(pageNo, pageSize, tenderNewsId, userAccountId);
}
}
package com.mmc.csf.release.dao;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.qo.IndustryNewsQO;
import com.mmc.csf.infomation.vo.IndustryNewsVO;
import com.mmc.csf.release.entity.IndustryNewsDO;
import org.apache.ibatis.annotations.Mapper;
......@@ -32,4 +34,14 @@ public interface IndustryNewsDao {
* @return
*/
IndustryNewsDO details(Integer id);
Integer count(IndustryNewsDO industryNewsDO);
Integer insert(IndustryNewsDO industryNewsDO);
Integer update(IndustryNewsDO industryNewsDO);
Integer countPage(IndustryNewsQO industryNewsQO);
List<IndustryNewsDO> backgroundListNewsPage(IndustryNewsQO industryNewsQO);
}
......@@ -5,6 +5,7 @@ import com.mmc.csf.release.entity.TenderApplyDO;
import com.mmc.csf.release.entity.TenderInfoDO;
import com.mmc.csf.release.entity.TenderNewsDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Date;
......@@ -35,7 +36,7 @@ public interface TenderDao {
List<TenderInfoDO> listTenderInfo(int itemIndex, Integer pageSize, Integer tenderNewsId);
void updateTenderInfo(Integer id, String tenderContent, BigDecimal tenderPrice);
void updateTenderInfo(@Param("id") Integer id, @Param("tenderTitle") String tenderTitle, @Param("tenderPrice") BigDecimal tenderPrice, @Param("tenderContent") String tenderContent);
TenderApplyDO getTenderApplyByUId(Integer userAccountId, Integer tenderInfoId);
......
package com.mmc.csf.release.entity;
import com.mmc.csf.infomation.vo.IndustryNewsVO;
import com.mmc.csf.infomation.vo.IndustryNewsDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -15,6 +17,7 @@ import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class IndustryNewsDO implements Serializable {
private static final long serialVersionUID = 3296973167970903480L;
private Integer id;
......@@ -25,18 +28,30 @@ public class IndustryNewsDO implements Serializable {
private String newsContents;
private Date createTime;
private Date updateTime;
@ApiModelProperty(value = "来源")
private String origin;
public IndustryNewsVO buildIndustryNewsVO(){
return IndustryNewsVO.builder().id(id).newsTitle(newsTitle).newsAuthor(newsAuthor).userAccountId(userAccountId).surfaceImg(surfaceImg).
newsContents(newsContents).createTime(createTime).updateTime(updateTime).build();
public IndustryNewsDTO buildIndustryNewsDTO(){
return IndustryNewsDTO.builder().id(id).newsTitle(newsTitle).newsAuthor(newsAuthor).userAccountId(userAccountId).surfaceImg(surfaceImg).
newsContents(newsContents).createTime(createTime).updateTime(updateTime).origin(origin).build();
}
public IndustryNewsDO(IndustryNewsVO industryNewsVO){
this.id = industryNewsVO.getId();
this.newsTitle = industryNewsVO.getNewsTitle();
this.newsAuthor = industryNewsVO.getNewsAuthor();
this.userAccountId = industryNewsVO.getUserAccountId();
this.surfaceImg = industryNewsVO.getSurfaceImg();
this.newsContents = industryNewsVO.getNewsContents();
public IndustryNewsDO(IndustryNewsDTO industryNewsDTO){
this.id = industryNewsDTO.getId();
this.newsTitle = industryNewsDTO.getNewsTitle();
this.newsAuthor = industryNewsDTO.getNewsAuthor();
this.userAccountId = industryNewsDTO.getUserAccountId();
this.surfaceImg = industryNewsDTO.getSurfaceImg();
this.newsContents = industryNewsDTO.getNewsContents();
}
public IndustryNewsDO(Integer id, String newsTitle, String newsAuthor, Integer userAccountId, String surfaceImg, String newsContents, String origin) {
this.id = id;
this.newsTitle = newsTitle;
this.newsAuthor = newsAuthor;
this.userAccountId = userAccountId;
this.surfaceImg = surfaceImg;
this.newsContents = newsContents;
this.origin = origin;
}
}
......@@ -31,7 +31,7 @@ public class TenderApplyDO implements Serializable {
private Date updateTime;
private String tenderInfoNo;
private String tenderContent;
private String tenderTitle;
public TenderApplyDO(TenderApplyVO tenderApplyVO) {
this.userAccountId = tenderApplyVO.getUserAccountId();
......@@ -44,7 +44,6 @@ public class TenderApplyDO implements Serializable {
public TenderApplyDTO buildTenderApplyDTO(){
return TenderApplyDTO.builder().id(this.id).tenderInfoId(this.tenderInfoId).nickName(this.nickName).userName(this.userName).phoneNum(this.phoneNum)
.createTime(this.createTime).tenderInfoNo(this.tenderInfoNo).tenderContent(this.tenderContent).build();
.createTime(this.createTime).tenderInfoNo(this.tenderInfoNo).tenderTitle(this.tenderTitle).build();
}
}
......@@ -2,6 +2,7 @@ package com.mmc.csf.release.entity;
import com.mmc.csf.infomation.dto.AppTenderInfoDTO;
import com.mmc.csf.infomation.dto.TenderInfoDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -23,6 +24,8 @@ public class TenderInfoDO implements Serializable {
private Integer id;
private Integer tenderNewsId;
private String tenderInfoNo;
private String tenderTitle;
@ApiModelProperty(value = "招标快讯内容")
private String tenderContent;
private BigDecimal tenderPrice;
private Integer deleted;
......@@ -30,12 +33,12 @@ public class TenderInfoDO implements Serializable {
private Date updateTime;
public TenderInfoDTO buildTenderInfoDTO(){
return TenderInfoDTO.builder().id(this.id).tenderNewsId(this.tenderNewsId).tenderInfoNo(this.tenderInfoNo).tenderContent(this.tenderContent)
.tenderPrice(this.tenderPrice).createTime(this.createTime).build();
return TenderInfoDTO.builder().id(this.id).tenderNewsId(this.tenderNewsId).tenderInfoNo(this.tenderInfoNo).tenderTitle(this.tenderTitle)
.tenderPrice(this.tenderPrice).createTime(this.createTime).tenderContent(this.tenderContent).build();
}
public AppTenderInfoDTO buildAppTenderInfoDTO(){
return AppTenderInfoDTO.builder().id(this.id).tenderNewsId(this.tenderNewsId).tenderInfoNo(this.tenderInfoNo).tenderContent(this.tenderContent)
return AppTenderInfoDTO.builder().id(this.id).tenderNewsId(this.tenderNewsId).tenderInfoNo(this.tenderInfoNo).tenderContent(this.tenderTitle)
.tenderPrice(this.tenderPrice).createTime(this.createTime).apply(0).build();
}
}
package com.mmc.csf.release.entity.tender;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* author:zhenjie
* Date:2022/5/23
* time:10:47
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("ExcelTenderInfo")
public class ExcelTenderInfo implements Serializable {
private static final long serialVersionUID = -3213483141870899916L;
@Excel(name = "*序号", width = 25)
@NotNull
private String tenderInfoNo;
@Excel(name = "*内容", width = 25)
@NotNull
@Size(max = 64, message = "标题长度过长")
private String tenderTitle;
@Excel(name = "价格(万元)", width = 25)
private BigDecimal tenderPrice;
}
......@@ -2,6 +2,9 @@ package com.mmc.csf.release.service;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.qo.IndustryNewsQO;
import com.mmc.csf.infomation.vo.IndustryNewsDTO;
import com.mmc.csf.infomation.vo.IndustryNewsVO;
import javax.servlet.http.HttpServletRequest;
......@@ -11,7 +14,7 @@ import javax.servlet.http.HttpServletRequest;
*/
public interface IndustryNewsService {
/**
* 新闻列表
* 新闻列表-web
* @param industryCaseQO
* @param request
* @return
......@@ -24,4 +27,19 @@ public interface IndustryNewsService {
* @return
*/
ResultBody details(Integer id);
/**
* 新闻插入
*/
ResultBody insertIndustryNews(IndustryNewsVO industryNewsVO, Integer userAccountId);
/**
* 新闻编辑
*/
ResultBody upDateIndustryNews(IndustryNewsVO industryNewsVO, Integer userAccountId);
/**
* 新闻列表-后台
*/
ResultBody<IndustryNewsDTO> backgroundListNewsPage(IndustryNewsQO industryNewsQO, HttpServletRequest request);
}
......@@ -2,11 +2,12 @@ package com.mmc.csf.release.service;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.vo.TenderApplyQO;
import com.mmc.csf.infomation.vo.TenderApplyVO;
import com.mmc.csf.infomation.vo.TenderInfoVO;
import com.mmc.csf.infomation.vo.TenderNewsVO;
import com.mmc.csf.release.auth.dto.LoginSuccessDTO;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
......@@ -28,11 +29,11 @@ public interface TenderService {
ResultBody listTenderInfo(Integer pageNo, Integer pageSize, Integer tenderNewsId);
ResultBody updateTenderInfo(Integer id, String tenderContent, BigDecimal tenderPrice);
ResultBody updateTenderInfo(TenderInfoVO tenderInfoVO);
ResultBody addTenderApply(TenderApplyVO tenderApplyVO, HttpServletRequest request);
ResultBody listTenderApply(Integer pageNo, Integer pageSize, Integer tenderNewsId, Integer tenderInfoId, String keyword);
ResultBody listTenderApply(TenderApplyQO param);
ResultBody listTenderInfoApp(Integer pageNo, Integer pageSize, Integer tenderNewsId, Integer userAccountId);
......
......@@ -2,7 +2,10 @@ package com.mmc.csf.release.service.impl;
import com.mmc.csf.common.util.page.PageResult;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.common.util.web.ResultEnum;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.qo.IndustryNewsQO;
import com.mmc.csf.infomation.vo.IndustryNewsDTO;
import com.mmc.csf.infomation.vo.IndustryNewsVO;
import com.mmc.csf.release.constant.TokenConstant;
import com.mmc.csf.release.dao.IndustryNewsDao;
......@@ -42,16 +45,53 @@ public class IndustryNewsServiceImpl implements IndustryNewsService {
Integer pageNo = industryCaseQO.getPageNo();
industryCaseQO.buildCurrentPage();
List<IndustryNewsDO> industryNewsDOList = industryNewsDao.listNewsPage(industryCaseQO);
List<IndustryNewsVO> industryNewsVOS = industryNewsDOList.stream().map(IndustryNewsDO::buildIndustryNewsVO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, industryCaseQO.getPageSize(), count, industryNewsVOS));
List<IndustryNewsDTO> industryNewsDTOS = industryNewsDOList.stream().map(IndustryNewsDO::buildIndustryNewsDTO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, industryCaseQO.getPageSize(), count, industryNewsDTOS));
}
@Override
public ResultBody details(Integer id) {
IndustryNewsDO industryNewsDO = industryNewsDao.details(id);
if (industryNewsDO!= null) {
return ResultBody.success(industryNewsDO.buildIndustryNewsVO());
return ResultBody.success(industryNewsDO.buildIndustryNewsDTO());
}
return ResultBody.success();
}
@Override
public ResultBody insertIndustryNews(IndustryNewsVO param, Integer userAccountId) {
IndustryNewsDO industryNewsDO = IndustryNewsDO.builder().newsTitle(param.getNewsTitle()).build();
Integer count = industryNewsDao.count(industryNewsDO);
if(count>0){
return ResultBody.error(ResultEnum.INDUSTRY_NEWS_TITLE_EXISTS);
}
industryNewsDO = new IndustryNewsDO(param.getId(), param.getNewsTitle(), param.getNewsAuthor(), userAccountId, param.getSurfaceImg(), param.getNewsContents(), param.getOrigin());
industryNewsDao.insert(industryNewsDO);
return ResultBody.success();
}
@Override
public ResultBody upDateIndustryNews(IndustryNewsVO param, Integer userAccountId) {
IndustryNewsDO industryNewsDO = IndustryNewsDO.builder().newsTitle(param.getNewsTitle()).build();
Integer count = industryNewsDao.count(industryNewsDO);
if(count>0){
return ResultBody.error(ResultEnum.INDUSTRY_NEWS_TITLE_EXISTS);
}
industryNewsDO = new IndustryNewsDO(param.getId(), param.getNewsTitle(), param.getNewsAuthor(), userAccountId, param.getSurfaceImg(), param.getNewsContents(), param.getOrigin());
industryNewsDao.update(industryNewsDO);
return ResultBody.success();
}
@Override
public ResultBody<IndustryNewsDTO> backgroundListNewsPage(IndustryNewsQO industryNewsQO, HttpServletRequest request) {
Integer count = industryNewsDao.countPage(industryNewsQO);
if (count == 0) {
return ResultBody.success(PageResult.buildPage(industryNewsQO.getPageNo(), industryNewsQO.getPageSize(), count));
}
Integer pageNo = industryNewsQO.getPageNo();
industryNewsQO.buildCurrentPage();
List<IndustryNewsDO> industryNewsDOList = industryNewsDao.backgroundListNewsPage(industryNewsQO);
List<IndustryNewsDTO> industryNewsDTOS = industryNewsDOList.stream().map(IndustryNewsDO::buildIndustryNewsDTO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, industryNewsQO.getPageSize(), count, industryNewsDTOS));
}
}
package com.mmc.csf.release.service.impl;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.mmc.csf.common.util.page.PageResult;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.common.util.web.ResultEnum;
import com.mmc.csf.infomation.dto.*;
import com.mmc.csf.infomation.qo.IndustryCaseQO;
import com.mmc.csf.infomation.vo.TenderApplyQO;
import com.mmc.csf.infomation.vo.TenderApplyVO;
import com.mmc.csf.infomation.vo.TenderInfoVO;
import com.mmc.csf.infomation.vo.TenderNewsVO;
import com.mmc.csf.release.auth.dto.LoginSuccessDTO;
import com.mmc.csf.release.constant.TokenConstant;
......@@ -13,9 +17,12 @@ import com.mmc.csf.release.dao.TenderDao;
import com.mmc.csf.release.entity.TenderApplyDO;
import com.mmc.csf.release.entity.TenderInfoDO;
import com.mmc.csf.release.entity.TenderNewsDO;
import com.mmc.csf.release.entity.tender.ExcelTenderInfo;
import com.mmc.csf.release.feign.UserAppApi;
import com.mmc.csf.release.service.TenderService;
import com.mmc.csf.release.util.MultipartFileUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -23,6 +30,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
......@@ -45,25 +53,23 @@ public class TenderServiceImpl implements TenderService {
private UserAppApi userAppApi;
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public ResultBody addTenderNews(MultipartFile file, TenderNewsVO tenderNewsVO) throws IOException {
TenderNewsDO tenderNewsDO = new TenderNewsDO(tenderNewsVO);
//检查快讯标题名称是否重复
int count = tenderDao.countExistSameName(tenderNewsVO.getId(), tenderNewsDO.getTenderName());
if(count > 0){
if (count > 0) {
return ResultBody.error(ResultEnum.EXIST_SAME_NAME_ERROR);
}
tenderDao.addTenderNewsDO(tenderNewsDO);
List<TenderInfoDO> tenderInfoDOList = new ArrayList<>();
List<TenderInfoDO> tenderInfoDOList;
ResultBody resultBody = listTenderInfo(file, tenderNewsDO);
if(resultBody.getCode().toString().equals("200")){
tenderInfoDOList = (List<TenderInfoDO>)resultBody.getResult();
}else {
if(!resultBody.getCode().equals("200")){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return resultBody;
}
tenderInfoDOList = (List<TenderInfoDO>) resultBody.getResult();
tenderDao.batchAddTenderInfo(tenderInfoDOList);
return ResultBody.success();
}
......@@ -75,9 +81,7 @@ public class TenderServiceImpl implements TenderService {
}
int itemIndex = (pageNo - 1) * pageSize;
List<TenderNewsDO> list = tenderDao.listTenderNews(itemIndex, pageSize, tenderName, startTime, endTime, using);
List<TenderNewsDTO> pageList = list.stream().map(d -> {
return d.buildTenderNewsDTO();
}).collect(Collectors.toList());
List<TenderNewsDTO> pageList = list.stream().map(TenderNewsDO::buildTenderNewsDTO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, count, pageList));
}
......@@ -87,18 +91,18 @@ public class TenderServiceImpl implements TenderService {
TenderNewsDO tenderNewsDO = new TenderNewsDO(tenderNewsVO);
//检查快讯标题名称是否重复
int count = tenderDao.countExistSameName(tenderNewsVO.getId(), tenderNewsDO.getTenderName());
if(count > 0){
if (count > 0) {
return ResultBody.error(ResultEnum.EXIST_SAME_NAME_ERROR);
}
if(file != null && !file.isEmpty()){
if (file != null && !file.isEmpty()) {
//把之前的覆盖
//删除之前的
tenderDao.batchRemoveTenderInfo(tenderNewsVO.getId());
List<TenderInfoDO> tenderInfoDOList = new ArrayList<>();
List<TenderInfoDO> tenderInfoDOList;
ResultBody resultBody = listTenderInfo(file, tenderNewsDO);
if(resultBody.getCode().toString().equals("200")){
tenderInfoDOList = (List<TenderInfoDO>)resultBody.getResult();
}else {
if (resultBody.getCode().equals("200")) {
tenderInfoDOList = (List<TenderInfoDO>) resultBody.getResult();
} else {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return resultBody;
}
......@@ -109,60 +113,52 @@ public class TenderServiceImpl implements TenderService {
}
private ResultBody listTenderInfo(MultipartFile file, TenderNewsDO tenderNewsDO) throws IOException {
//TenderNewsDO tenderNewsDO = new TenderNewsDO(tenderNewsVO);
// ImportParams params = new ImportParams();
// params.setTitleRows(0);
// params.setHeadRows(1);
// File importFile = MultipartFileUtil.multipartFileToFile(file);
// List<ExcelTenderInfo> list = ExcelImportUtil.importExcel(importFile, ExcelTenderInfo.class, params);
// //删除必填项都为空的记录,有一个空的情况不去除,可以提醒用户重新上传
// list.removeIf(d-> d.getTenderContent() == null && d.getTenderInfoNo() == null);
// // 删除临时文件
// MultipartFileUtil.delteTempFile(importFile);
// //判断是否为空,空的话,要提醒
// if(list.isEmpty()){
// return ResultBody.error(ResultEnum.FILE_PARSE_ERROR);
// }
// //把之前的覆盖
// //删除之前的
// //tenderDao.batchRemoveTenderInfo(tenderNewsVO.getId());
// //添加
// List<TenderInfoDO> tenderInfoDOList = new ArrayList<>();
// for(ExcelTenderInfo tenderInfo : list){
// TenderInfoDO tenderInfoDO = new TenderInfoDO();
// tenderInfoDO.setTenderNewsId(tenderNewsDO.getId());
// //不能为空,
// if(tenderInfo.getTenderInfoNo() == null || tenderInfo.getTenderInfoNo().trim().isEmpty()){
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// return ResultBody.error(ResultEnum.TENDER_FORMAT_ERROR);
// }else {
// tenderInfoDO.setTenderInfoNo(tenderInfo.getTenderInfoNo().trim());
// }
// //判断长度,不能为空,且长度在64之内
// if(tenderInfo.getTenderContent() == null || tenderInfo.getTenderContent().trim().isEmpty()){
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// return ResultBody.error(ResultEnum.TENDER_FORMAT_ERROR);
// }else {
// if(tenderInfo.getTenderContent().trim().length() > 120){
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// return ResultBody.error(ResultEnum.TENDER_CONTENT_TOO_LONG_ERROR);
// }
// tenderInfoDO.setTenderContent(tenderInfo.getTenderContent().trim());
// }
// //做判断
// BigDecimal beforeTenderPrice = BigDecimal.valueOf(10000000);
// BigDecimal afterTenderPrice = tenderInfo.getTenderPrice() == null ? BigDecimal.ZERO : tenderInfo.getTenderPrice();
// if( afterTenderPrice.compareTo(BigDecimal.ZERO) >= 0 && afterTenderPrice.compareTo(beforeTenderPrice) <= 0 ){
// tenderInfoDO.setTenderPrice(afterTenderPrice);
// }else {
// //抛出异常
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// return ResultBody.error(ResultEnum.PRICE_TO_HIGH_ERROR);
// }
// tenderInfoDOList.add(tenderInfoDO);
// }
// return ResultBody.success(tenderInfoDOList);
return ResultBody.success();
ImportParams params = new ImportParams();
params.setTitleRows(0);
params.setHeadRows(1);
File importFile = MultipartFileUtil.multipartFileToFile(file);
List<ExcelTenderInfo> list = ExcelImportUtil.importExcel(importFile, ExcelTenderInfo.class, params);
//删除必填项都为空的记录,有一个空的情况不去除,可以提醒用户重新上传
list.removeIf(d -> d.getTenderTitle() == null && d.getTenderInfoNo() == null);
// 删除临时文件
MultipartFileUtil.delteTempFile(importFile);
//判断是否为空,空的话,要提醒
if (list.isEmpty()) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error(ResultEnum.FILE_PARSE_ERROR);
}
//添加
List<TenderInfoDO> tenderInfoDOList = new ArrayList<>();
for (ExcelTenderInfo tenderInfo : list) {
TenderInfoDO tenderInfoDO = new TenderInfoDO();
tenderInfoDO.setTenderNewsId(tenderNewsDO.getId());
//序号不能为空
if (StringUtils.isBlank(tenderInfo.getTenderInfoNo())) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error(ResultEnum.TENDER_FORMAT_ERROR);
}
tenderInfoDO.setTenderInfoNo(tenderInfo.getTenderInfoNo().trim());
//内容判断长度,不能为空,且长度在64之内
if (StringUtils.isBlank(tenderInfo.getTenderTitle())) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error(ResultEnum.TENDER_FORMAT_ERROR);
}
if (tenderInfo.getTenderTitle().trim().length() > 64) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error(ResultEnum.TENDER_CONTENT_TOO_LONG_ERROR);
}
tenderInfoDO.setTenderTitle(tenderInfo.getTenderTitle().trim());
BigDecimal beforeTenderPrice = BigDecimal.valueOf(10000000);
BigDecimal afterTenderPrice = tenderInfo.getTenderPrice() == null ? BigDecimal.ZERO : tenderInfo.getTenderPrice();
// 标价请确认在0-10000000万元内
if (afterTenderPrice.compareTo(BigDecimal.ZERO) <= 0 || afterTenderPrice.compareTo(beforeTenderPrice) >= 0) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultBody.error(ResultEnum.PRICE_TO_HIGH_ERROR);
}
tenderInfoDO.setTenderPrice(afterTenderPrice);
tenderInfoDOList.add(tenderInfoDO);
}
return ResultBody.success(tenderInfoDOList);
}
@Override
......@@ -179,15 +175,13 @@ public class TenderServiceImpl implements TenderService {
}
int itemIndex = (pageNo - 1) * pageSize;
List<TenderInfoDO> list = tenderDao.listTenderInfo(itemIndex, pageSize, tenderNewsId);
List<TenderInfoDTO> pageList = list.stream().map(d -> {
return d.buildTenderInfoDTO();
}).collect(Collectors.toList());
List<TenderInfoDTO> pageList = list.stream().map(TenderInfoDO::buildTenderInfoDTO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, count, pageList));
}
@Override
public ResultBody updateTenderInfo(Integer id, String tenderContent, BigDecimal tenderPrice) {
tenderDao.updateTenderInfo(id, tenderContent, tenderPrice);
public ResultBody updateTenderInfo(TenderInfoVO param) {
tenderDao.updateTenderInfo(param.getId(), param.getTenderTitle(), param.getTenderPrice(),param.getTenderContent());
return ResultBody.success();
}
......@@ -195,7 +189,7 @@ public class TenderServiceImpl implements TenderService {
public ResultBody addTenderApply(TenderApplyVO tenderApplyVO, HttpServletRequest request) {
//判断之前有没有申请
TenderApplyDO beforeTenderApplyDO = tenderDao.getTenderApplyByUId(tenderApplyVO.getUserAccountId(), tenderApplyVO.getTenderInfoId());
if(beforeTenderApplyDO != null){
if (beforeTenderApplyDO != null) {
return ResultBody.error(ResultEnum.HAS_BEEN_APPLY_ERROR);
}
UserAccountSimpleDTO userAccountSimpleDTO = userAppApi.feignGetUserSimpleInfo(tenderApplyVO.getUserAccountId(), request.getHeader(TokenConstant.TOKEN));
......@@ -208,16 +202,16 @@ public class TenderServiceImpl implements TenderService {
}
@Override
public ResultBody listTenderApply(Integer pageNo, Integer pageSize, Integer tenderNewsId, Integer tenderInfoId, String keyword) {
int count = tenderDao.countListTenderApply(tenderNewsId, tenderInfoId, keyword);
public ResultBody listTenderApply(TenderApplyQO param) {
Integer pageNo = param.getPageNo();
Integer pageSize = param.getPageSize();
int count = tenderDao.countListTenderApply(param.getTenderNewsId(), param.getTenderInfoId(), param.getUserName());
if (count == 0) {
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, count));
}
int itemIndex = (pageNo - 1) * pageSize;
List<TenderApplyDO> list = tenderDao.listTenderApply(itemIndex, pageSize, tenderNewsId, tenderInfoId, keyword);
List<TenderApplyDTO> pageList = list.stream().map(d -> {
return d.buildTenderApplyDTO();
}).collect(Collectors.toList());
List<TenderApplyDO> list = tenderDao.listTenderApply(itemIndex, pageSize, param.getTenderNewsId(), param.getTenderInfoId(), param.getUserName());
List<TenderApplyDTO> pageList = list.stream().map(TenderApplyDO::buildTenderApplyDTO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, count, pageList));
}
......@@ -233,12 +227,12 @@ public class TenderServiceImpl implements TenderService {
return d.buildAppTenderInfoDTO();
}).collect(Collectors.toList());
List<TenderApplyDO> applyDOList = tenderDao.listAppTenderApply(tenderNewsId, userAccountId);
if(userAccountId == null){
if (userAccountId == null) {
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, count, pageList));
}
for(AppTenderInfoDTO appTenderInfoDTO : pageList){
for(TenderApplyDO tenderApplyDO : applyDOList){
if(tenderApplyDO.getTenderInfoId().toString().equals(appTenderInfoDTO.getId().toString())){
for (AppTenderInfoDTO appTenderInfoDTO : pageList) {
for (TenderApplyDO tenderApplyDO : applyDOList) {
if (tenderApplyDO.getTenderInfoId().toString().equals(appTenderInfoDTO.getId().toString())) {
appTenderInfoDTO.setApply(1);
break;
}
......@@ -250,7 +244,7 @@ public class TenderServiceImpl implements TenderService {
@Override
public ResultBody listTenderInfoAppLatest(Integer pageNo, Integer pageSize, Integer userAccountId) {
TenderNewsDO tenderNewsDO = tenderDao.latestTenderNewsDO();
if( tenderNewsDO == null ){
if (tenderNewsDO == null) {
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, 0));
}
int count = tenderDao.countListTenderInfoApp(tenderNewsDO.getId());
......@@ -259,13 +253,13 @@ public class TenderServiceImpl implements TenderService {
List<AppTenderInfoDTO> pageList = list.stream().map(d -> {
return d.buildAppTenderInfoDTO();
}).collect(Collectors.toList());
if(userAccountId == null){
if (userAccountId == null) {
return ResultBody.success(PageResult.buildPage(pageNo, pageSize, count, pageList));
}
List<TenderApplyDO> applyDOList = tenderDao.listAppTenderApply(tenderNewsDO.getId(), userAccountId);
for(AppTenderInfoDTO appTenderInfoDTO : pageList){
for(TenderApplyDO tenderApplyDO : applyDOList){
if(tenderApplyDO.getTenderInfoId().toString().equals(appTenderInfoDTO.getId().toString())){
for (AppTenderInfoDTO appTenderInfoDTO : pageList) {
for (TenderApplyDO tenderApplyDO : applyDOList) {
if (tenderApplyDO.getTenderInfoId().toString().equals(appTenderInfoDTO.getId().toString())) {
appTenderInfoDTO.setApply(1);
break;
}
......@@ -278,8 +272,8 @@ public class TenderServiceImpl implements TenderService {
public ResultBody listNewTenderInfo(IndustryCaseQO industryCaseQO,
LoginSuccessDTO loginSuccessDTO, HttpServletRequest request) {
//查询对应地区的用户, 默认查广东
industryCaseQO.setProvinceCode(industryCaseQO.getProvinceCode() == null ? 440000 : industryCaseQO.getProvinceCode());
List<Integer> userIds = userAppApi.feignListUserAccountIds(industryCaseQO.getProvinceCode() , industryCaseQO.getCityCode(), industryCaseQO.getDistrictCode(), request.getHeader(TokenConstant.TOKEN));
industryCaseQO.setProvinceCode(industryCaseQO.getProvinceCode() == null ? 440000 : industryCaseQO.getProvinceCode());
List<Integer> userIds = userAppApi.feignListUserAccountIds(industryCaseQO.getProvinceCode(), industryCaseQO.getCityCode(), industryCaseQO.getDistrictCode(), request.getHeader(TokenConstant.TOKEN));
industryCaseQO.setUserIds(userIds);
int count = tenderDao.countNewListTenderInfo(industryCaseQO);
if (count == 0) {
......@@ -296,10 +290,10 @@ public class TenderServiceImpl implements TenderService {
//查出已申请过的并做标记
List<Integer> applyTenderInfoIds = tenderDao.listApplyTenderInfoIds(tenderInfoIds, loginSuccessDTO.getUserAccountId());
if (CollectionUtils.isNotEmpty(applyTenderInfoIds)) {
pageList.forEach(d->{
if(applyTenderInfoIds.contains(d.getId())){
pageList.forEach(d -> {
if (applyTenderInfoIds.contains(d.getId())) {
d.setApply(1);
}else {
} else {
d.setApply(0);
}
});
......
package com.mmc.csf.release.util;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月18日 下午5:40:56
* @explain 类说明
*/
public class MultipartFileUtil {
/**
* MultipartFile 转 File
*
* @param file
* @throws Exception
*/
public static File multipartFileToFile(MultipartFile file) throws IOException {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
// 获取流文件
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除本地临时文件
*
* @param file
*/
public static void delteTempFile(File file) {
if (file != null) {
File del = new File(file.toURI());
del.delete();
}
}
}
......@@ -3,7 +3,8 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.csf.release.dao.IndustryNewsDao">
<select id="countListNewsPage" resultType="java.lang.Integer" parameterType="com.mmc.csf.infomation.qo.IndustryCaseQO">
<select id="countListNewsPage" resultType="java.lang.Integer"
parameterType="com.mmc.csf.infomation.qo.IndustryCaseQO">
select count(*) from industry_news
where is_deleted = 0
<if test=" userIds != null ">
......@@ -17,13 +18,15 @@
</if>
</select>
<select id="listNewsPage" resultType="com.mmc.csf.release.entity.IndustryNewsDO" parameterType="com.mmc.csf.infomation.qo.IndustryCaseQO">
<select id="listNewsPage" resultType="com.mmc.csf.release.entity.IndustryNewsDO"
parameterType="com.mmc.csf.infomation.qo.IndustryCaseQO">
select id,
news_title,
news_author,
user_account_id,
surface_img,
news_contents,
origin,
create_time,
update_time
from industry_news
......@@ -43,14 +46,118 @@
<select id="details" resultType="com.mmc.csf.release.entity.IndustryNewsDO">
select id,
news_title,
news_author,
user_account_id,
surface_img,
news_contents,
origin,
create_time,
update_time
from industry_news
where is_deleted = 0
and id = #{id}
</select>
<select id="count" resultType="java.lang.Integer" parameterType="com.mmc.csf.release.entity.IndustryNewsDO">
select count(*)
from industry_news
<where>
is_deleted = 0
<if test="newsTitle != null and newsTitle != ''">
and news_title = #{newsTitle}
</if>
<if test="newsAuthor != null and newsAuthor != ''">
and news_author = #{newsAuthor}
</if>
<if test="userAccountId != null">
and user_account_id = #{userAccountId}
</if>
<if test="surfaceImg != null and surfaceImg != ''">
and surface_img = #{surfaceImg}
</if>
<if test="newsContents != null and newsContents != ''">
and news_contents = #{newsContents}
</if>
<if test="origin != null and origin != ''">
and origin = #{origin}
</if>
</where>
</select>
<insert id="insert" parameterType="com.mmc.csf.release.entity.IndustryNewsDO" useGeneratedKeys="true"
keyColumn="id">
insert into industry_news(news_title, news_author, user_account_id, surface_img, news_contents, origin,
create_time)
values (#{newsTitle}, #{newsAuthor}, #{userAccountId}, #{surfaceImg}, #{newsContents}, #{origin}, now())
</insert>
<update id="update" parameterType="com.mmc.csf.release.entity.IndustryNewsDO">
update industry_news
<set>
<if test="newsTitle != null and newsTitle != ''">
news_title = #{newsTitle},
</if>
<if test="newsAuthor != null and newsAuthor != ''">
news_author = #{newsAuthor},
</if>
<if test="userAccountId != null">
user_account_id = #{userAccountId},
</if>
<if test="surfaceImg != null and surfaceImg != ''">
surface_img = #{surfaceImg},
</if>
<if test="newsContents != null">
news_contents = #{newsContents},
</if>
<if test="origin != null and origin != ''">
origin = #{origin},
</if>
</set>
where is_deleted = 0 and id = #{id}
</update>
<select id="countPage" parameterType="com.mmc.csf.infomation.qo.IndustryNewsQO" resultType="java.lang.Integer">
select count(*)
from industry_news
<where>
is_deleted = 0
<if test="newsTitle != null and newsTitle != ''">
and news_title like concat('%',#{newsTitle},'%')
</if>
<if test="startTime != null">
and create_time &gt;= #{startTime}
</if>
<if test="endTime != null">
and create_time &lt;= #{endTime}
</if>
</where>
</select>
<select id="backgroundListNewsPage" parameterType="com.mmc.csf.infomation.qo.IndustryNewsQO"
resultType="com.mmc.csf.release.entity.IndustryNewsDO">
select id,
news_title,
news_author,
user_account_id,
surface_img,
news_contents,
origin,
create_time,
update_time
from industry_news
where is_deleted = 0 and id = #{id}
<where>
is_deleted = 0
<if test="newsTitle != null and newsTitle != ''">
and news_title like concat('%',#{newsTitle},'%')
</if>
<if test="startTime != null">
and create_time &gt;= #{startTime}
</if>
<if test="endTime != null">
and create_time &lt;= #{endTime}
</if>
</where>
order by create_time desc
limit #{pageNo}, #{pageSize}
</select>
</mapper>
\ No newline at end of file
......@@ -17,11 +17,12 @@
<id column="id" property="id"/>
<result column="tender_news_id" property="tenderNewsId"/>
<result column="tender_info_no" property="tenderInfoNo"/>
<result column="tender_content" property="tenderContent"/>
<result column="tender_title" property="tenderTitle"/>
<result column="tender_price" property="tenderPrice"/>
<result column="is_deleted" property="deleted"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="tender_content" property="tenderContent"/>
</resultMap>
<resultMap id="tenderApplyResultMap" type="com.mmc.csf.release.entity.TenderApplyDO">
......@@ -36,26 +37,26 @@
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="tender_info_no" property="tenderInfoNo"/>
<result column="tender_content" property="tenderContent"/>
<result column="tender_title" property="tenderTitle"/>
</resultMap>
<insert id="addTenderNewsDO" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.csf.release.entity.TenderNewsDO">
insert into tender_news(tender_name,is_using,port,create_time)
values(#{tenderName},#{using},#{port},NOW())
insert into tender_news(tender_name, is_using, port, create_time)
values (#{tenderName}, #{using}, #{port}, NOW())
</insert>
<insert id="batchAddTenderInfo" useGeneratedKeys="true"
<insert id="batchAddTenderInfo" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.csf.release.entity.TenderInfoDO">
insert into
tender_info(tender_news_id,tender_info_no,tender_content,tender_price,create_time)
tender_info(tender_news_id,tender_info_no,tender_title,tender_price,create_time)
values
<foreach item="item" index="index" collection="list"
separator=",">
(
#{item.tenderNewsId},
#{item.tenderInfoNo},
#{item.tenderContent},
#{item.tenderTitle},
#{item.tenderPrice},
NOW()
)
......@@ -63,12 +64,15 @@
</insert>
<insert id="addTenderApply" parameterType="com.mmc.csf.release.entity.TenderApplyDO">
insert into tender_apply(user_account_id, tender_news_id, tender_info_id, nick_name, user_name, phone_num, create_time)
values(#{userAccountId},#{tenderNewsId},#{tenderInfoId},#{nickName},#{userName},#{phoneNum},NOW());
insert into tender_apply(user_account_id, tender_news_id, tender_info_id, nick_name, user_name, phone_num,
create_time)
values (#{userAccountId}, #{tenderNewsId}, #{tenderInfoId}, #{nickName}, #{userName}, #{phoneNum}, NOW());
</insert>
<update id="batchRemoveTenderInfo">
update tender_info set is_deleted = 1 where tender_news_id = #{tenderNewsId}
update tender_info
set is_deleted = 1
where tender_news_id = #{tenderNewsId}
</update>
<update id="updateTenderNews" parameterType="com.mmc.csf.release.entity.TenderNewsDO">
......@@ -88,17 +92,22 @@
</update>
<update id="removeTenderNews">
update tender_news set is_deleted = 1 where id = #{id}
update tender_news
set is_deleted = 1
where id = #{id}
</update>
<update id="updateTenderInfo">
update tender_info
<set>
<if test=" tenderContent != null ">
tender_content = #{tenderContent},
<if test=" tenderTitle != null ">
tender_title = #{tenderTitle},
</if>
<if test=" tenderPrice != null ">
tender_price = #{tenderPrice}
tender_price = #{tenderPrice},
</if>
<if test="tenderContent!=null">
tender_content = #{tenderContent}
</if>
</set>
where id = #{id}
......@@ -141,12 +150,15 @@
</select>
<select id="countListTenderInfoApp" resultType="java.lang.Integer">
select count(*) from tender_info
where is_deleted = 0 and tender_news_id = #{tenderNewsId}
select count(*)
from tender_info
where is_deleted = 0
and tender_news_id = #{tenderNewsId}
</select>
<select id="listTenderInfoApp" resultMap="tenderInfoResultMap">
select id, tender_news_id, tender_price, tender_info_no, tender_content, is_deleted, create_time, update_time
select id, tender_news_id, tender_price, tender_info_no, tender_title, is_deleted, create_time,
update_time,tender_content
from tender_info
where is_deleted = 0
<if test=" tenderNewsId != null ">
......@@ -157,12 +169,15 @@
</select>
<select id="countListTenderInfo" resultType="java.lang.Integer">
select count(*) from tender_info
where is_deleted = 0 and tender_news_id = #{tenderNewsId}
select count(*)
from tender_info
where is_deleted = 0
and tender_news_id = #{tenderNewsId}
</select>
<select id="listTenderInfo" resultMap="tenderInfoResultMap">
select id, tender_news_id, tender_price, tender_info_no, tender_content, is_deleted, create_time, update_time
select id, tender_news_id, tender_price, tender_info_no, tender_title, is_deleted, create_time,
update_time,tender_content
from tender_info
where is_deleted = 0
<if test=" tenderNewsId != null ">
......@@ -173,17 +188,26 @@
</select>
<select id="getTenderApplyByUId" resultMap="tenderApplyResultMap">
select id, user_account_id, tender_news_id, tender_info_id, nick_name,
user_name, phone_num, is_deleted, create_time, update_time
select id,
user_account_id,
tender_news_id,
tender_info_id,
nick_name,
user_name,
phone_num,
is_deleted,
create_time,
update_time
from tender_apply
where user_account_id = #{userAccountId} and tender_info_id = #{tenderInfoId}
where user_account_id = #{userAccountId}
and tender_info_id = #{tenderInfoId}
</select>
<select id="countListTenderApply" resultType="java.lang.Integer">
SELECT
count(*)
count(*)
FROM
tender_apply ta left join tender_info ti on ta.tender_info_id = ti.id
tender_apply ta left join tender_info ti on ta.tender_info_id = ti.id
where ti.is_deleted = 0
<if test=" tenderNewsId != null ">
and ta.tender_news_id = #{tenderNewsId}
......@@ -198,20 +222,20 @@
<select id="listTenderApply" resultMap="tenderApplyResultMap">
SELECT
ta.id,
ti.tender_info_no,
ta.user_account_id,
ti.tender_content,
ta.tender_news_id,
ta.tender_info_id,
ta.nick_name,
ta.user_name,
ta.phone_num,
ta.is_deleted,
ta.create_time,
ta.update_time
ta.id,
ti.tender_info_no,
ta.user_account_id,
ti.tender_title,
ta.tender_news_id,
ta.tender_info_id,
ta.nick_name,
ta.user_name,
ta.phone_num,
ta.is_deleted,
ta.create_time,
ta.update_time
FROM
tender_apply ta left join tender_info ti on ta.tender_info_id = ti.id
tender_apply ta left join tender_info ti on ta.tender_info_id = ti.id
where ti.is_deleted = 0
<if test=" tenderNewsId != null ">
and ta.tender_news_id = #{tenderNewsId}
......@@ -227,42 +251,43 @@
</select>
<select id="listAppTenderApply" resultMap="tenderApplyResultMap">
SELECT
ta.id,
ta.tender_info_id,
ti.tender_news_id,
ti.tender_info_no,
ti.tender_content,
ti.is_deleted,
ti.create_time,
ti.update_time,
ta.user_account_id
FROM
tender_apply ta
INNER JOIN tender_info ti ON ta.tender_info_id = ti.id
WHERE
ti.is_deleted = 0 and ta.tender_news_id = #{tenderNewsId} and ta.user_account_id = #{userAccountId}
SELECT ta.id,
ta.tender_info_id,
ti.tender_news_id,
ti.tender_info_no,
ti.tender_title,
ti.is_deleted,
ti.create_time,
ti.update_time,
ta.user_account_id
FROM tender_apply ta
INNER JOIN tender_info ti ON ta.tender_info_id = ti.id
WHERE ti.is_deleted = 0
and ta.tender_news_id = #{tenderNewsId}
and ta.user_account_id = #{userAccountId}
</select>
<select id="latestTenderNewsDO" resultMap="tenderNewsResultMap">
select id,tender_name,is_using,port,is_deleted,create_time from tender_news
where is_deleted = 0 and is_using = 1
order by create_time desc
limit 0, 1
select id, tender_name, is_using, port, is_deleted, create_time
from tender_news
where is_deleted = 0
and is_using = 1
order by create_time desc limit 0, 1
</select>
<select id="countExistSameName" resultType="java.lang.Integer">
select count(*) from tender_news
where is_deleted = 0
<if test=" id != null ">
and id &lt;&gt; #{id}
and id &lt;&gt; #{id}
</if>
<if test=" tenderName != null ">
and tender_name = #{tenderName}
</if>
</select>
<select id="countNewListTenderInfo" resultType="java.lang.Integer" parameterType="com.mmc.csf.infomation.qo.IndustryCaseQO">
<select id="countNewListTenderInfo" resultType="java.lang.Integer"
parameterType="com.mmc.csf.infomation.qo.IndustryCaseQO">
select count(*) from tender_news tn INNER JOIN tender_info ti ON tn.id = ti.tender_news_id
where
tn.is_deleted = 0 and tn.is_using = 1 and ti.is_deleted = 0
......@@ -279,8 +304,9 @@
<select id="listNewListTenderInfo" resultType="com.mmc.csf.release.entity.TenderInfoDO">
select
ti.id, ti.tender_news_id, ti.tender_price, ti.tender_info_no, ti.tender_content, ti.is_deleted, ti.create_time, ti.update_time
from tender_news tn INNER JOIN tender_info ti ON tn.id = ti.tender_news_id
ti.id, ti.tender_news_id, ti.tender_price, ti.tender_info_no, ti.tender_title, ti.is_deleted, ti.create_time,
ti.update_time
from tender_news tn INNER JOIN tender_info ti ON tn.id = ti.tender_news_id
where
tn.is_deleted = 0 and tn.is_using = 1 and ti.is_deleted = 0
<if test=" date != null ">
......@@ -298,7 +324,8 @@
<select id="listApplyTenderInfoIds" resultType="java.lang.Integer">
select ti.id
from tender_news tn INNER JOIN tender_info ti ON tn.id = ti.tender_news_id INNER JOIN tender_apply ta ON ta.tender_info_id = ti.id
from tender_news tn INNER JOIN tender_info ti ON tn.id = ti.tender_news_id INNER JOIN tender_apply ta ON
ta.tender_info_id = ti.id
where ta.user_account_id = #{applyUserId} and ta.is_deleted = 0
<if test="tenderInfoIds != null">
<foreach collection="tenderInfoIds" item="id" index="index"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论