diff --git a/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java b/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java index a419192b..bcbd6c39 100644 --- a/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java +++ b/src/main/java/com/glxp/api/constant/BasicExportTypeEnum.java @@ -73,6 +73,11 @@ public enum BasicExportTypeEnum { PRODUCE_BUSINESS_DATA("thr_manufacturer", "生产企业数据"), + + /** + * 药品关联信息任务同步 + */ + DRUG_DATA_TASK("drug_data_task", "药品关联信息任"), ; @EnumValue private String key; diff --git a/src/main/java/com/glxp/api/constant/RedissonCacheKey.java b/src/main/java/com/glxp/api/constant/RedissonCacheKey.java index 0716ba7f..8036f660 100644 --- a/src/main/java/com/glxp/api/constant/RedissonCacheKey.java +++ b/src/main/java/com/glxp/api/constant/RedissonCacheKey.java @@ -38,4 +38,6 @@ public interface RedissonCacheKey { * web添加单据 */ String WEB_ADD_CODE = "web_add_code"; + + String XML_UPLOAD="xml_upload"; } diff --git a/src/main/java/com/glxp/api/controller/collect/RelCodeBatchController.java b/src/main/java/com/glxp/api/controller/collect/RelCodeBatchController.java new file mode 100644 index 00000000..b854a721 --- /dev/null +++ b/src/main/java/com/glxp/api/controller/collect/RelCodeBatchController.java @@ -0,0 +1,114 @@ +package com.glxp.api.controller.collect; + +import com.github.pagehelper.PageInfo; +import com.glxp.api.annotation.CusRedissonAnnotation; +import com.glxp.api.annotation.RepeatSubmit; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import com.glxp.api.constant.RedissonCacheKey; +import com.glxp.api.controller.BaseController; +import com.glxp.api.entity.collect.RelCodeBatch; +import com.glxp.api.req.collect.RelCodeBatchRequest; +import com.glxp.api.req.collect.RelCodeDetailRequest; +import com.glxp.api.res.PageSimpleResponse; +import com.glxp.api.res.collect.RelCodeBatchResponse; +import com.glxp.api.service.collect.RelCodeBatchService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +@Slf4j +@RestController +public class RelCodeBatchController extends BaseController { + + @Resource + private RelCodeBatchService relCodeBatchService; + + /** + * 上传文件保存 + * @param uuid + * @param file + * @return + */ + @RepeatSubmit() + @CusRedissonAnnotation(cacheName = RedissonCacheKey.XML_UPLOAD, key = {"#uuid"}, timeOutMsg = "系统正在处理,请勿重复上传") + @PostMapping("/udiwms/relCode/batch/xmlUpload") + public BaseResponse xmlUpload(@RequestParam("uuid") String uuid,@RequestParam("file") MultipartFile file) { + relCodeBatchService.xmlUpload(file); + return ResultVOUtils.successMsg("上传成功!"); + } + + /** + * 手动添加 + * @param relCodeBatchRequest + * @return + */ + @RepeatSubmit() + @PostMapping("/udiwms/relCode/batch/add") + public BaseResponse add(@RequestBody @Valid RelCodeBatchRequest relCodeBatchRequest,BindingResult bindingResult) { + relCodeBatchService.add(relCodeBatchRequest); + return ResultVOUtils.successMsg("添加成功!"); + } + + /** + * 添加拼箱 + * @param relCodeBatchRequest + * @return + */ + @RepeatSubmit() + @PostMapping("/udiwms/relCode/batch/addRelCodeSpellBox") + public BaseResponse addRelCodeSpellBox(@RequestBody @Valid List relCodeBatchRequest,BindingResult bindingResult) { + relCodeBatchService.addRelCodeSpellBox(relCodeBatchRequest); + return ResultVOUtils.successMsg("添加成功!"); + } + + @GetMapping("/udiwms/relCode/batch/filter") + public BaseResponse list(RelCodeBatchRequest relCodeBatchRequest, BindingResult bindingResult) { + List relCodeBatchResponses = relCodeBatchService.filterList(relCodeBatchRequest); + PageInfo pageInfo = new PageInfo<>(relCodeBatchResponses); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(relCodeBatchResponses); + return ResultVOUtils.success(pageSimpleResponse); + } + + @GetMapping("/udiwms/relCode/batch/get") + public BaseResponse get(@RequestParam("id") Long id) { + RelCodeBatch relCodeBatch = relCodeBatchService.getById(id); + return ResultVOUtils.success(relCodeBatch); + } + + @GetMapping("/udiwms/relCode/batch/delete") + public BaseResponse delete(@RequestParam("id") Long id) { + relCodeBatchService.delete(id); + return ResultVOUtils.success("删除成功"); + } + + + @PostMapping("/udiwms/relCode/batch/update") + public BaseResponse update(@RequestBody @Valid RelCodeBatch relCodeBatch) { + relCodeBatchService.updateById(relCodeBatch); + return ResultVOUtils.success("修改成功!"); + } + + + + @GetMapping("/udiwms/relCode/batch/deleteDetail") + public BaseResponse deleteDetail(@RequestParam("curCode") String curCode) { + relCodeBatchService.deleteDetail(curCode); + return ResultVOUtils.success("删除成功"); + } + + + @PostMapping("/udiwms/relCode/batch/deleteAllDetail") + public BaseResponse deleteAllDetail(@RequestBody List detailList) { + relCodeBatchService.deleteAllDetail(detailList); + return ResultVOUtils.success("清空成功"); + } + +} diff --git a/src/main/java/com/glxp/api/controller/collect/RelCodeDetailController.java b/src/main/java/com/glxp/api/controller/collect/RelCodeDetailController.java new file mode 100644 index 00000000..5d041643 --- /dev/null +++ b/src/main/java/com/glxp/api/controller/collect/RelCodeDetailController.java @@ -0,0 +1,70 @@ +package com.glxp.api.controller.collect; + + +import com.github.pagehelper.PageInfo; +import com.glxp.api.annotation.RepeatSubmit; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import com.glxp.api.controller.BaseController; +import com.glxp.api.entity.collect.RelCodeDetail; +import com.glxp.api.req.collect.RelCodeDetailRequest; +import com.glxp.api.res.PageSimpleResponse; +import com.glxp.api.res.collect.RelCodeDetailResponse; +import com.glxp.api.service.collect.RelCodeDetailService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +@Slf4j +@RestController +public class RelCodeDetailController extends BaseController { + + @Resource + private RelCodeDetailService relCodeDetailService; + + + + /** + * 扫码 + * @param relCodeDetailRequest + * @return + */ + @RepeatSubmit() + @PostMapping("/udiwms/relCode/detail/scanCode") + public BaseResponse scanCode(@RequestBody @Valid RelCodeDetailRequest relCodeDetailRequest, BindingResult bindingResult) { + RelCodeDetailResponse relCodeDetailResponse = relCodeDetailService.scanCode(relCodeDetailRequest); + return ResultVOUtils.success(relCodeDetailResponse); + } + + + @GetMapping("/udiwms/relCode/detail/filter") + public BaseResponse list(RelCodeDetailRequest relCodeDetailRequest, BindingResult bindingResult) { + List relCodeDetailResponses = relCodeDetailService.filterList(relCodeDetailRequest); + PageInfo pageInfo = new PageInfo<>(relCodeDetailResponses); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(relCodeDetailResponses); + return ResultVOUtils.success(pageSimpleResponse); + } + + + @GetMapping("/udiwms/relCode/detail/get") + public BaseResponse get(Long id) { + RelCodeDetail relCodeDetail = relCodeDetailService.getById(id); + return ResultVOUtils.success(relCodeDetail); + } + + + @PostMapping("/udiwms/relCode/detail/update") + public BaseResponse update(@RequestBody @Valid RelCodeDetail relCodeDetail) { + relCodeDetailService.updateById(relCodeDetail); + return ResultVOUtils.success("修改成功!"); + } +} diff --git a/src/main/java/com/glxp/api/controller/sync/SpsSyncDownloadController.java b/src/main/java/com/glxp/api/controller/sync/SpsSyncDownloadController.java index 1ff4edc5..fcab721e 100644 --- a/src/main/java/com/glxp/api/controller/sync/SpsSyncDownloadController.java +++ b/src/main/java/com/glxp/api/controller/sync/SpsSyncDownloadController.java @@ -17,6 +17,8 @@ import com.glxp.api.constant.*; import com.glxp.api.constant.Constant; import com.glxp.api.dao.auth.*; import com.glxp.api.dao.basic.*; +import com.glxp.api.dao.collect.RelCodeBatchMapper; +import com.glxp.api.dao.collect.RelCodeDetailMapper; import com.glxp.api.dao.dev.*; import com.glxp.api.dao.inout.*; import com.glxp.api.dao.inv.*; @@ -26,6 +28,8 @@ import com.glxp.api.dao.system.*; import com.glxp.api.dao.thrsys.*; import com.glxp.api.entity.auth.*; import com.glxp.api.entity.basic.*; +import com.glxp.api.entity.collect.RelCodeBatch; +import com.glxp.api.entity.collect.RelCodeDetail; import com.glxp.api.entity.dev.*; import com.glxp.api.entity.inout.*; import com.glxp.api.entity.inv.DeviceInspectTaskEntity; @@ -40,6 +44,8 @@ import com.glxp.api.req.sync.SyncUpLoadRequest; import com.glxp.api.res.sync.*; import com.glxp.api.service.auth.InvWarehouseService; import com.glxp.api.service.basic.IBasicBussinessTypeService; +import com.glxp.api.service.collect.RelCodeBatchService; +import com.glxp.api.service.collect.RelCodeDetailService; import com.glxp.api.service.dev.DeviceUpkeepService; import com.glxp.api.service.inout.IoAddInoutService; import com.glxp.api.service.inout.IoCheckInoutService; @@ -401,6 +407,9 @@ public class SpsSyncDownloadController { case PRODUCE_BUSINESS_DATA: saveUploadProBusinessData(JSONUtil.toBean(obj, SpsSyncProBusinessDataResponse.class)); break; + case DRUG_DATA_TASK: + saveUploadDrugData(JSONUtil.toBean(obj, SpsSyncDrugDataTaskResponse.class)); + break; } String taskId = obj.getStr("taskId"); BasicDownloadStatusEntity downloadStatus = BasicDownloadStatusEntity.builder() @@ -426,6 +435,26 @@ public class SpsSyncDownloadController { } + @Resource + RelCodeDetailMapper relCodeDetailMapper; + @Resource + RelCodeBatchMapper relCodeBatchMapper; + + private void saveUploadDrugData(SpsSyncDrugDataTaskResponse bean) { + if (CollectionUtil.isNotEmpty(bean.getRelCodeBatches())) { + for (RelCodeBatch entity : bean.getRelCodeBatches()) { + entity.setUpdateTime(null); + } + boolean b = relCodeBatchMapper.replaceBatchs(bean.getRelCodeBatches()); + } + if (CollectionUtil.isNotEmpty(bean.getRelCodeDetails())) { +// for (RelCodeDetail entity : bean.getRelCodeDetails()) { +// entity.setUpdateTime(null); +// } + boolean b = relCodeDetailMapper.replaceBatchs(bean.getRelCodeDetails()); + } + } + private String writeFile(String filePath, String fileDesc, String content) throws IOException { filePath = String.format("%s/%s", filePath, DateUtil.getDate()); diff --git a/src/main/java/com/glxp/api/dao/collect/RelCodeBatchMapper.java b/src/main/java/com/glxp/api/dao/collect/RelCodeBatchMapper.java new file mode 100644 index 00000000..1444da15 --- /dev/null +++ b/src/main/java/com/glxp/api/dao/collect/RelCodeBatchMapper.java @@ -0,0 +1,17 @@ +package com.glxp.api.dao.collect; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.glxp.api.dao.BaseMapperPlus; +import com.glxp.api.entity.collect.RelCodeBatch; +import com.glxp.api.entity.collect.RelCodeDetail; +import com.glxp.api.req.collect.RelCodeBatchRequest; +import com.glxp.api.res.collect.RelCodeBatchResponse; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface RelCodeBatchMapper extends BaseMapperPlus { + List filterList(RelCodeBatchRequest relCodeBatchRequest); + +} diff --git a/src/main/java/com/glxp/api/dao/collect/RelCodeDetailMapper.java b/src/main/java/com/glxp/api/dao/collect/RelCodeDetailMapper.java new file mode 100644 index 00000000..f2354f64 --- /dev/null +++ b/src/main/java/com/glxp/api/dao/collect/RelCodeDetailMapper.java @@ -0,0 +1,18 @@ +package com.glxp.api.dao.collect; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.glxp.api.dao.BaseMapperPlus; +import com.glxp.api.dao.thrsys.ThrManufacturerMapper; +import com.glxp.api.entity.collect.RelCodeDetail; +import com.glxp.api.entity.thrsys.ThrManufacturerEntity; +import com.glxp.api.req.collect.RelCodeDetailRequest; +import com.glxp.api.res.collect.RelCodeDetailResponse; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface RelCodeDetailMapper extends BaseMapperPlus { + List filterList(RelCodeDetailRequest relCodeDetailRequest); + +} diff --git a/src/main/java/com/glxp/api/entity/collect/RelCodeBatch.java b/src/main/java/com/glxp/api/entity/collect/RelCodeBatch.java new file mode 100644 index 00000000..e7e6e176 --- /dev/null +++ b/src/main/java/com/glxp/api/entity/collect/RelCodeBatch.java @@ -0,0 +1,115 @@ +package com.glxp.api.entity.collect; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@ApiModel(value="com-glxp-api-entity-collect-RelCodeBatch") +@Data +@TableName(value = "rel_code_batch") +public class RelCodeBatch implements Serializable { + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value="") + private Integer id; + + /** + * 产品编码 + */ + @TableField(value = "productCode") + @ApiModelProperty(value="产品编码") + private String productCode; + + /** + * 类型编码 + */ + @TableField(value = "subTypeNo") + @ApiModelProperty(value="类型编码") + private String subTypeNo; + + /** + * 包装比例 + */ + @TableField(value = "cascadeRatio") + @ApiModelProperty(value="包装比例") + private String cascadeRatio; + + /** + * 包装规格 + */ + @TableField(value = "packageSpec") + @ApiModelProperty(value="包装规格") + private String packageSpec; + + /** + * 备注 + */ + @TableField(value = "comment") + @ApiModelProperty(value="备注") + private String comment; + + /** + * 批次号 + */ + @TableField(value = "batchNo") + @ApiModelProperty(value="批次号") + private String batchNo; + + /** + * 生产日期 + */ + @TableField(value = "madeDate") + @ApiModelProperty(value="生产日期") + private String madeDate; + + /** + * 有效期至 + */ + @TableField(value = "validateDate") + @ApiModelProperty(value="有效期至") + private String validateDate; + + /** + * 生产车间 + */ + @TableField(value = "workShop") + @ApiModelProperty(value="生产车间") + private String workShop; + + /** + * 生产线 + */ + @TableField(value = "lineName") + @ApiModelProperty(value="生产线") + private String lineName; + + /** + * 负责人 + */ + @TableField(value = "lineManager") + @ApiModelProperty(value="负责人") + private String lineManager; + + @TableField(value = "createTime") + @ApiModelProperty(value = "") + private Date createTime; + + @TableField(value = "`createUser`") + @ApiModelProperty(value = "") + private String createUser; + + @TableField(value = "updateTime") + @ApiModelProperty(value = "") + private Date updateTime; + + @TableField(value = "updateUser") + @ApiModelProperty(value = "") + private String updateUser; + +} diff --git a/src/main/java/com/glxp/api/entity/collect/RelCodeDetail.java b/src/main/java/com/glxp/api/entity/collect/RelCodeDetail.java new file mode 100644 index 00000000..85eccb68 --- /dev/null +++ b/src/main/java/com/glxp/api/entity/collect/RelCodeDetail.java @@ -0,0 +1,56 @@ +package com.glxp.api.entity.collect; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@ApiModel(value="com-glxp-api-entity-collect-RelCodeDetail") +@Data +@TableName(value = "rel_code_detail") +public class RelCodeDetail implements Serializable { + @TableId(value = "id", type = IdType.INPUT) + @ApiModelProperty(value="") + private Integer id; + + /** + * 当前条码 + */ + @TableField(value = "curCode") + @ApiModelProperty(value="当前条码") + private String curCode; + + /** + * 包装级别 + */ + @TableField(value = "packLayer") + @ApiModelProperty(value="包装级别") + private Integer packLayer; + + /** + * 父级码 + */ + @TableField(value = "parentCode") + @ApiModelProperty(value="父级码") + private String parentCode; + + /** + * 状态 + */ + @TableField(value = "flag") + @ApiModelProperty(value="状态") + private Integer flag; + + /** + * 产品批次ID外键 + */ + @TableField(value = "batchIdFk") + @ApiModelProperty(value="产品批次ID外键") + private Integer batchIdFk; + +} diff --git a/src/main/java/com/glxp/api/req/collect/RelCodeBatchRequest.java b/src/main/java/com/glxp/api/req/collect/RelCodeBatchRequest.java new file mode 100644 index 00000000..bfceb11b --- /dev/null +++ b/src/main/java/com/glxp/api/req/collect/RelCodeBatchRequest.java @@ -0,0 +1,84 @@ +package com.glxp.api.req.collect; + +import com.glxp.api.util.page.ListPageRequest; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class RelCodeBatchRequest extends ListPageRequest { + + private Integer id; + + /** + * 产品编码 + */ + private String productCode; + + /** + * 类型编码 + */ + private String subTypeNo; + + /** + * 包装比例 + */ + private String cascadeRatio; + + /** + * 包装规格 + */ + private String packageSpec; + + /** + * 备注 + */ + private String comment; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private String madeDate; + + /** + * 有效期至 + */ + private String validateDate; + + /** + * 生产车间 + */ + private String workShop; + + /** + * 生产线 + */ + private String lineName; + + /** + * 负责人 + */ + private String lineManager; + + private Date createTime; + + private String createUser; + + private Date updateTime; + + private String updateUser; + + private String keyWords; + + private List detailList; + + private String code; + private String startDate; + private String endDate; +} diff --git a/src/main/java/com/glxp/api/req/collect/RelCodeDetailRequest.java b/src/main/java/com/glxp/api/req/collect/RelCodeDetailRequest.java new file mode 100644 index 00000000..3e26b05a --- /dev/null +++ b/src/main/java/com/glxp/api/req/collect/RelCodeDetailRequest.java @@ -0,0 +1,103 @@ +package com.glxp.api.req.collect; + +import com.glxp.api.util.page.ListPageRequest; +import lombok.Data; + +import java.util.Date; + +@Data +public class RelCodeDetailRequest extends ListPageRequest { + + private Integer id; + + /** + * 当前条码 + */ + private String curCode; + + /** + * 包装级别 + */ + private Integer packLayer; + + /** + * 父级码 + */ + private String parentCode; + + /** + * 状态 + */ + private Integer flag; + + /** + * 产品批次ID外键 + */ + private Integer batchIdFk; + + /** + * 产品编码 + */ + private String productCode; + + /** + * 类型编码 + */ + private String subTypeNo; + + /** + * 包装比例 + */ + private String cascadeRatio; + + /** + * 包装规格 + */ + private String packageSpec; + + /** + * 备注 + */ + private String comment; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private Date madeDate; + + /** + * 有效期至 + */ + private Date validateDate; + + /** + * 生产车间 + */ + private String workShop; + + /** + * 生产线 + */ + private String lineName; + + /** + * 负责人 + */ + private String lineManager; + + private Date createTime; + + private String createUser; + + private Date updateTime; + + private String updateUser; + + private String keyWords; + +} diff --git a/src/main/java/com/glxp/api/res/collect/RelCodeBatchResponse.java b/src/main/java/com/glxp/api/res/collect/RelCodeBatchResponse.java new file mode 100644 index 00000000..4cc2daf7 --- /dev/null +++ b/src/main/java/com/glxp/api/res/collect/RelCodeBatchResponse.java @@ -0,0 +1,84 @@ +package com.glxp.api.res.collect; + +import lombok.Data; + +import java.util.Date; + +@Data +public class RelCodeBatchResponse { + + private Integer id; + + /** + * 产品编码 + */ + private String productCode; + + /** + * 类型编码 + */ + private String subTypeNo; + + /** + * 包装比例 + */ + private String cascadeRatio; + + /** + * 包装规格 + */ + private String packageSpec; + + /** + * 备注 + */ + private String comment; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private Date madeDate; + + /** + * 有效期至 + */ + private Date validateDate; + + /** + * 生产车间 + */ + private String workShop; + + /** + * 生产线 + */ + private String lineName; + + /** + * 负责人 + */ + private String lineManager; + + /** + * 产品名称,通用名称 + */ + private String cpmctymc; + /** + * 包含下级数量 + */ + private Integer bhxjsl; + + /** + * 包装单位 + */ + private String packUnit; + /** + * 包装级别 + */ + private Integer packLayer; +} diff --git a/src/main/java/com/glxp/api/res/collect/RelCodeDetailResponse.java b/src/main/java/com/glxp/api/res/collect/RelCodeDetailResponse.java new file mode 100644 index 00000000..6d9b6de5 --- /dev/null +++ b/src/main/java/com/glxp/api/res/collect/RelCodeDetailResponse.java @@ -0,0 +1,108 @@ +package com.glxp.api.res.collect; + +import lombok.Data; + +import java.util.Date; + +@Data +public class RelCodeDetailResponse { + + private Integer id; + + /** + * 当前条码 + */ + private String curCode; + + /** + * 包装级别 + */ + private Integer packLayer; + + /** + * 父级码 + */ + private String parentCode; + + /** + * 状态 + */ + private Integer flag; + + /** + * 产品批次ID外键 + */ + private Integer batchIdFk; + + //=======================具体详情======================== + + /** + * 产品编码 + */ + private String productCode; + + /** + * 类型编码 + */ + private String subTypeNo; + + /** + * 包装比例 + */ + private String cascadeRatio; + + /** + * 包装规格 + */ + private String packageSpec; + + /** + * 备注 + */ + private String comment; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private Date madeDate; + + /** + * 有效期至 + */ + private Date validateDate; + + /** + * 生产车间 + */ + private String workShop; + + /** + * 生产线 + */ + private String lineName; + + /** + * 负责人 + */ + private String lineManager; + + /** + * 产品名称,通用名称 + */ + private String cpmctymc; + /** + * 包含下级数量 + */ + private Integer bhxjsl; + + /** + * 包装单位 + */ + private String packUnit; + +} diff --git a/src/main/java/com/glxp/api/res/sync/SpsSyncDrugDataTaskResponse.java b/src/main/java/com/glxp/api/res/sync/SpsSyncDrugDataTaskResponse.java new file mode 100644 index 00000000..d44b33d2 --- /dev/null +++ b/src/main/java/com/glxp/api/res/sync/SpsSyncDrugDataTaskResponse.java @@ -0,0 +1,16 @@ +package com.glxp.api.res.sync; + +import com.glxp.api.entity.collect.RelCodeBatch; +import com.glxp.api.entity.collect.RelCodeDetail; +import lombok.Data; + +import java.util.List; + +@Data +public class SpsSyncDrugDataTaskResponse extends BaseSyncResponse { + + public List relCodeBatches; + + public List relCodeDetails; + +} diff --git a/src/main/java/com/glxp/api/service/collect/RelCodeBatchService.java b/src/main/java/com/glxp/api/service/collect/RelCodeBatchService.java new file mode 100644 index 00000000..2343c539 --- /dev/null +++ b/src/main/java/com/glxp/api/service/collect/RelCodeBatchService.java @@ -0,0 +1,220 @@ +package com.glxp.api.service.collect; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.XmlUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.glxp.api.dao.collect.RelCodeBatchMapper; +import com.glxp.api.entity.auth.AuthAdmin; +import com.glxp.api.entity.collect.RelCodeBatch; +import com.glxp.api.entity.collect.RelCodeDetail; +import com.glxp.api.exception.JsonException; +import com.glxp.api.req.collect.RelCodeBatchRequest; +import com.glxp.api.req.collect.RelCodeDetailRequest; +import com.glxp.api.res.collect.RelCodeBatchResponse; +import com.glxp.api.service.auth.CustomerService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class RelCodeBatchService extends ServiceImpl { + + + @Resource + private RelCodeDetailService relCodeDetailService; + @Resource + private CustomerService customerService; + + /** + * 上传保存关联信息 + * @param file + */ + @Transactional(rollbackFor = Exception.class) + public void xmlUpload(MultipartFile file) { + try { + String fileName = file.getOriginalFilename(); + String suffix = FileUtil.getSuffix(fileName); + if(! "xml".equals(suffix)){ + throw new JsonException("仅支持XML,文件类型错误"+suffix); + } + log.info(file.getSize()+"文件长度"); + if(file.getSize() > 5 * 1024 *1024){ + throw new JsonException("上传文件超过5M"); + } + List relCodeDetails = new ArrayList<>(); + Document document = XmlUtil.readXML(file.getInputStream()); + //获取根 + Element rootElement = XmlUtil.getRootElement(document); + //截取Relation + NodeList relation = rootElement.getElementsByTagName("Relation"); + if(relation == null){ + throw new JsonException("XML文件解析错误"); + } + Element relationE = (Element) relation.item(0); + String productCode = relationE.getAttribute("productCode"); + String subTypeNo = relationE.getAttribute("subTypeNo"); + String cascade = relationE.getAttribute("cascade"); + String packageSpec = relationE.getAttribute("packageSpec"); + String comment = relationE.getAttribute("comment"); + //截取Batch + NodeList batch = rootElement.getElementsByTagName("Batch"); + if(batch == null){ + throw new JsonException("XML文件解析错误"); + } + AuthAdmin user = customerService.getUserBean(); + for (int i = 0; i < batch.getLength(); i++) { + Node batchNode = batch.item(i); + RelCodeBatch relCodeBatch = new RelCodeBatch(); + if (batchNode.getNodeType() == Node.ELEMENT_NODE) { + Element batchE = (Element) batchNode; + relCodeBatch.setProductCode(productCode); + relCodeBatch.setSubTypeNo(subTypeNo); + relCodeBatch.setCascadeRatio(cascade); + relCodeBatch.setPackageSpec(packageSpec); + relCodeBatch.setComment(comment); + String batchNo = batchE.getAttribute("batchNo"); + relCodeBatch.setBatchNo(batchNo); + String madeDate = batchE.getAttribute("madeDate"); + relCodeBatch.setMadeDate(madeDate); +// relCodeBatch.setMadeDate(DateUtil.parse(madeDate,"yyyy-MM-dd")); + String validateDate = batchE.getAttribute("validateDate"); +// relCodeBatch.setValidateDate(DateUtil.offsetDay(DateUtil.parse(validateDate,"yyyy-MM-dd"),1)); + relCodeBatch.setValidateDate(String.valueOf(DateUtil.offsetDay(DateUtil.parse(validateDate,"yyyy-MM-dd"),1))); + String workShop = batchE.getAttribute("workShop"); + relCodeBatch.setWorkShop(workShop); + String lineName = batchE.getAttribute("lineName"); + relCodeBatch.setLineName(lineName); + String lineManager = batchE.getAttribute("lineManager"); + relCodeBatch.setLineManager(lineManager); + relCodeBatch.setCreateTime(new Date()); + relCodeBatch.setCreateUser(user.getUserName()); + relCodeBatch.setUpdateTime(new Date()); + relCodeBatch.setUpdateUser(user.getUserName()); + this.save(relCodeBatch); + } + //batch下的节点code + NodeList code = batchNode.getChildNodes(); + for (int j = 0; j < code.getLength(); j++) { + Node codeNode = code.item(j); + RelCodeDetail relCodeDetail = new RelCodeDetail(); + if (codeNode.getNodeType() == Node.ELEMENT_NODE) { + Element codeE = (Element) codeNode; + relCodeDetail.setBatchIdFk(relCodeBatch.getId()); + String curCode = codeE.getAttribute("curCode"); + relCodeDetail.setCurCode(curCode); + String packLayer = codeE.getAttribute("packLayer"); + relCodeDetail.setPackLayer(Integer.valueOf(packLayer)); + String parentCode = codeE.getAttribute("parentCode"); + relCodeDetail.setParentCode(StrUtil.isNotBlank(parentCode)?parentCode:"0"); + String flag = codeE.getAttribute("flag"); + relCodeDetail.setFlag(Integer.valueOf(flag)); + relCodeDetails.add(relCodeDetail); + } + } + } + relCodeDetailService.saveBatch(relCodeDetails); + }catch (Exception e){ + throw new JsonException("上传失败:"+e.getMessage()); + } + + } + + /** + * 手动添加 + * @param relCodeBatchRequest + */ + @Transactional(rollbackFor = Exception.class) + public void add(RelCodeBatchRequest relCodeBatchRequest) { + List detailList = relCodeBatchRequest.getDetailList(); + if(CollUtil.isEmpty(detailList)){ + throw new JsonException("关联明细不能为空!"); + } + AuthAdmin user = customerService.getUserBean(); + RelCodeBatch relCodeBatch = new RelCodeBatch(); + BeanUtils.copyProperties(relCodeBatchRequest,relCodeBatch); + relCodeBatch.setCreateTime(new Date()); + relCodeBatch.setCreateUser(user.getUserName()); + relCodeBatch.setUpdateTime(new Date()); + relCodeBatch.setUpdateUser(user.getUserName()); + this.save(relCodeBatch); + List relCodeDetails = new ArrayList<>(); + for(RelCodeDetailRequest request : detailList){ + RelCodeDetail relCodeDetail = new RelCodeDetail(); + String parentCode = request.getParentCode(); + request.setParentCode(StrUtil.isNotBlank(parentCode)?parentCode:"0"); + BeanUtils.copyProperties(request,relCodeDetail); + relCodeDetail.setBatchIdFk(relCodeBatch.getId()); + relCodeDetails.add(relCodeDetail); + } + relCodeDetailService.saveBatch(relCodeDetails); + } + + public List filterList(RelCodeBatchRequest relCodeBatchRequest) { + if (relCodeBatchRequest == null) { + return Collections.emptyList(); + } + if (relCodeBatchRequest.getPage() != null) { + int offset = (relCodeBatchRequest.getPage() - 1) * relCodeBatchRequest.getLimit(); + PageHelper.offsetPage(offset, relCodeBatchRequest.getLimit()); + } + return this.baseMapper.filterList(relCodeBatchRequest); + } + + @Transactional(rollbackFor = Exception.class) + public void delete(Long id) { + if(id == null){ + throw new JsonException("id 不能为空"); + } + relCodeDetailService.remove(new LambdaQueryWrapper().eq(RelCodeDetail::getBatchIdFk,id)); + this.removeById(id); + } + + @Transactional(rollbackFor = Exception.class) + public void addRelCodeSpellBox(List relCodeBatchRequests) { + if (CollUtil.isEmpty(relCodeBatchRequests)){ + throw new JsonException("单据信息异常!"); + } + relCodeBatchRequests.forEach( item -> { + this.add(item); + }); + } + + @Transactional(rollbackFor = Exception.class) + public void deleteDetail(String curCode) { + List list = relCodeDetailService.list(new LambdaQueryWrapper().eq(RelCodeDetail::getParentCode, curCode)); + if (CollUtil.isNotEmpty(list)){ + List batchIds = list.stream().map(RelCodeDetail::getBatchIdFk).collect(Collectors.toList()); + this.removeBatchByIds(batchIds); + relCodeDetailService.remove(new LambdaQueryWrapper().in(RelCodeDetail::getBatchIdFk,batchIds)); + } + } + + @Transactional(rollbackFor = Exception.class) + public void deleteAllDetail(List detailList) { + if (CollUtil.isNotEmpty(detailList)){ + detailList.forEach( item -> { + String curCode = item.getCurCode(); + this.deleteDetail(curCode); + }); + } + } +} diff --git a/src/main/java/com/glxp/api/service/collect/RelCodeDetailService.java b/src/main/java/com/glxp/api/service/collect/RelCodeDetailService.java new file mode 100644 index 00000000..2d004bf1 --- /dev/null +++ b/src/main/java/com/glxp/api/service/collect/RelCodeDetailService.java @@ -0,0 +1,116 @@ +package com.glxp.api.service.collect; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.glxp.api.dao.basic.BasicProductsDao; +import com.glxp.api.dao.collect.RelCodeDetailMapper; +import com.glxp.api.entity.basic.BasicProductsEntity; +import com.glxp.api.entity.basic.UdiEntity; +import com.glxp.api.entity.collect.RelCodeDetail; +import com.glxp.api.exception.JsonException; +import com.glxp.api.req.collect.RelCodeDetailRequest; +import com.glxp.api.res.collect.RelCodeDetailResponse; +import com.glxp.api.util.udi.FilterUdiUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; + +@Service +public class RelCodeDetailService extends ServiceImpl { + + @Resource + private BasicProductsDao basicProductsDao; + + /** + * 扫码获取关联 + * @param relCodeDetailRequest + * @return + */ + public RelCodeDetailResponse scanCode(RelCodeDetailRequest relCodeDetailRequest) { + String curCode = relCodeDetailRequest.getCurCode(); + String parentCode = relCodeDetailRequest.getParentCode(); + if(StrUtil.isBlank(curCode)){ + throw new JsonException("追溯码不能为空"); + } + if (curCode.endsWith("\u001D")) { + curCode = curCode.replace("\u001D", ""); + } + UdiEntity curCodeUdi = FilterUdiUtils.getUdi(curCode); + if (curCodeUdi == null){ + throw new JsonException("无效条码!"); + } + RelCodeDetailResponse relCodeDetailResponse = new RelCodeDetailResponse(); + LambdaQueryWrapper cw = new LambdaQueryWrapper() + .eq(BasicProductsEntity::getNameCode, curCodeUdi.getUdi()) + .last("limit 1"); + BasicProductsEntity cur = basicProductsDao.selectOne(cw); + if(cur == null){ + throw new JsonException("产品信息不存在"); + } + //是否已存在数据库中 + List list = this.baseMapper.selectList(new LambdaQueryWrapper().eq(RelCodeDetail::getCurCode, curCode)); + if (CollUtil.isNotEmpty(list)){ + throw new JsonException("当前条码关联关系已被维护!"); + } + if(StrUtil.isNotBlank(parentCode)){ + if (parentCode.endsWith("\u001D")) { + parentCode = parentCode.replace("\u001D", ""); + } + if(StrUtil.equals(curCode,parentCode)){ + throw new JsonException("录入条码重复!"); + } + UdiEntity parentCodeUdi = FilterUdiUtils.getUdi(parentCode); + if (parentCodeUdi == null){ + throw new JsonException("无效父级条码!"); + } + LambdaQueryWrapper pw = new LambdaQueryWrapper() + .eq(BasicProductsEntity::getNameCode, parentCodeUdi.getUdi()) + .last("limit 1"); + BasicProductsEntity parent = basicProductsDao.selectOne(pw); + if(parent == null){ + throw new JsonException("父级产品信息不存在"); + } + if(!StrUtil.equals(parent.getUuid(),cur.getUuid())){ + throw new JsonException("当前条码不是同一产品"); + } + if(Integer.valueOf(parent.getPackLevel()) - Integer.valueOf(cur.getPackLevel()) != 1){ + throw new JsonException("当前条码不属于子条码"); + } + }else { + parentCode = "0"; + } + relCodeDetailResponse.setCurCode(curCode); + relCodeDetailResponse.setParentCode(parentCode); + relCodeDetailResponse.setPackLayer(Integer.valueOf(cur.getPackLevel())); + relCodeDetailResponse.setFlag(1); + relCodeDetailResponse.setCpmctymc(cur.getCpmctymc()); + relCodeDetailResponse.setProductCode(cur.getNameCode()); + relCodeDetailResponse.setBhxjsl(cur.getBhxjsl()); + relCodeDetailResponse.setPackageSpec(cur.getBzgg()); + relCodeDetailResponse.setCascadeRatio(cur.getPackRatio()); + relCodeDetailResponse.setPackUnit(cur.getPackUnit()); + return relCodeDetailResponse; + } + + /** + * 明细列表 + * @param relCodeDetailRequest + * @return + */ + public List filterList(RelCodeDetailRequest relCodeDetailRequest) { + if (relCodeDetailRequest == null) { + return Collections.emptyList(); + } + if (relCodeDetailRequest.getPage() != null) { + int offset = (relCodeDetailRequest.getPage() - 1) * relCodeDetailRequest.getLimit(); + PageHelper.offsetPage(offset, relCodeDetailRequest.getLimit()); + } + return this.baseMapper.filterList(relCodeDetailRequest); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e3c3910a..553884d1 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -3,7 +3,7 @@ server: spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver - jdbc-url: jdbc:p6spy:mysql://127.0.0.1:3306/udi_spms_pt2?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true + jdbc-url: jdbc:p6spy:mysql://192.168.0.44:3306/udi_spms_ct?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root password: 123456 hikari: diff --git a/src/main/resources/mybatis/mapper/collect/RelCodeBatchMapper.xml b/src/main/resources/mybatis/mapper/collect/RelCodeBatchMapper.xml new file mode 100644 index 00000000..c399c288 --- /dev/null +++ b/src/main/resources/mybatis/mapper/collect/RelCodeBatchMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + id, productCode, subTypeNo, `cascadeRatio`, packageSpec, `comment`, batchNo, madeDate, + validateDate, workShop, lineName, lineManager + + + + diff --git a/src/main/resources/mybatis/mapper/collect/RelCodeDetailMapper.xml b/src/main/resources/mybatis/mapper/collect/RelCodeDetailMapper.xml new file mode 100644 index 00000000..df48c153 --- /dev/null +++ b/src/main/resources/mybatis/mapper/collect/RelCodeDetailMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + id, curCode, packLayer, parentCode, flag, batchIdFk + + + + diff --git a/src/main/resources/schemas/schema_v2.3.sql b/src/main/resources/schemas/schema_v2.3.sql index 56251141..91738a3f 100644 --- a/src/main/resources/schemas/schema_v2.3.sql +++ b/src/main/resources/schemas/schema_v2.3.sql @@ -870,8 +870,4 @@ END; # call Modify_UNIQUE_index('thr_products_add_di', '`uuid`, `customerId`', 'uniqueUuid', 'BTREE'); -CALL Pro_Temp_ColumnWork('basic_bussiness_type', 'vailHcType', - 'tinyint NULL DEFAULT NULL COMMENT '' 校验耗材类型 :0:不耗材;1:高值耗材;2:无普通耗材''', 1); - -CALL Pro_Temp_ColumnWork('basic_udirel', 'isStack', 'tinyint', 1); diff --git a/src/main/resources/schemas/schema_v2.4.sql b/src/main/resources/schemas/schema_v2.4.sql index 173545b8..8f750777 100644 --- a/src/main/resources/schemas/schema_v2.4.sql +++ b/src/main/resources/schemas/schema_v2.4.sql @@ -975,3 +975,9 @@ CALL Pro_Temp_ColumnWork('basic_products', 'pinyinInitial', 'varchar(255)', 1); CALL Pro_Temp_ColumnWork('basic_products', 'destinyType', ' int(0) NULL DEFAULT NULL COMMENT''类型:1:定数包,内部使用;2:项目、组套外部关联''', 1); + +CALL Pro_Temp_ColumnWork('basic_bussiness_type', 'vailHcType', + 'tinyint NULL DEFAULT NULL COMMENT '' 校验耗材类型 :0:不耗材;1:高值耗材;2:无普通耗材''', 1); + + +CALL Pro_Temp_ColumnWork('basic_udirel', 'isStack', 'tinyint', 1);