From db8e6c514c9fc968f9201c9b81f42f677b3486ea Mon Sep 17 00:00:00 2001 From: wenshijun Date: Wed, 29 Oct 2025 10:15:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=85=8D=E9=80=81=E7=89=A9?= =?UTF-8?q?=E6=96=99=E5=AD=97=E6=AE=B5=20=E4=BC=98=E5=8C=96u=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DeliveryMtdController.java | 112 +++++ .../information/controller/MtdController.java | 36 +- .../information/domain/DeliveryMtd.java | 132 ++++++ .../information/mapper/DeliveryMtdMapper.java | 68 +++ .../project/information/mapper/MtdMapper.java | 7 + .../service/IDeliveryMtdService.java | 69 ++++ .../information/service/IMtdService.java | 13 + .../service/impl/DeliveryMtdServiceImpl.java | 132 ++++++ .../service/impl/MtdServiceImpl.java | 118 ++++++ .../wisdom/controller/RkInfoController.java | 1 + .../com/zg/project/wisdom/domain/RkInfo.java | 27 ++ .../wisdom/domain/dto/PcRkInfoItemDTO.java | 6 + .../project/wisdom/domain/vo/PlanToMtdVO.java | 13 + .../zg/project/wisdom/mapper/GysJhMapper.java | 9 + .../service/impl/RkInfoServiceImpl.java | 5 + src/main/resources/application-druid.yml | 4 +- src/main/resources/application.yml | 4 +- .../mybatis/information/DeliveryMtdMapper.xml | 115 ++++++ .../mybatis/information/MtdMapper.xml | 4 + .../resources/mybatis/wisdom/GysJhMapper.xml | 13 + .../resources/mybatis/wisdom/RkInfoMapper.xml | 387 +++++++++--------- 21 files changed, 1069 insertions(+), 206 deletions(-) create mode 100644 src/main/java/com/zg/project/information/controller/DeliveryMtdController.java create mode 100644 src/main/java/com/zg/project/information/domain/DeliveryMtd.java create mode 100644 src/main/java/com/zg/project/information/mapper/DeliveryMtdMapper.java create mode 100644 src/main/java/com/zg/project/information/service/IDeliveryMtdService.java create mode 100644 src/main/java/com/zg/project/information/service/impl/DeliveryMtdServiceImpl.java create mode 100644 src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java create mode 100644 src/main/resources/mybatis/information/DeliveryMtdMapper.xml diff --git a/src/main/java/com/zg/project/information/controller/DeliveryMtdController.java b/src/main/java/com/zg/project/information/controller/DeliveryMtdController.java new file mode 100644 index 0000000..0639d4f --- /dev/null +++ b/src/main/java/com/zg/project/information/controller/DeliveryMtdController.java @@ -0,0 +1,112 @@ +package com.zg.project.information.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.zg.framework.aspectj.lang.annotation.Log; +import com.zg.framework.aspectj.lang.enums.BusinessType; +import com.zg.project.information.domain.DeliveryMtd; +import com.zg.project.information.service.IDeliveryMtdService; +import com.zg.framework.web.controller.BaseController; +import com.zg.framework.web.domain.AjaxResult; +import com.zg.common.utils.poi.ExcelUtil; +import com.zg.framework.web.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 配送系统物料字典Controller + * + * @author zg + * @date 2025-10-24 + */ +@RestController +@RequestMapping("/information/delivery") +public class DeliveryMtdController extends BaseController +{ + @Autowired + private IDeliveryMtdService deliveryMtdService; + + /** + * 查询配送系统物料字典列表 + */ + @PreAuthorize("@ss.hasPermi('information:delivery:list')") + @GetMapping("/list") + public TableDataInfo list(DeliveryMtd deliveryMtd) + { + startPage(); + List list = deliveryMtdService.selectDeliveryMtdList(deliveryMtd); + return getDataTable(list); + } + + /** + * 导出配送系统物料字典列表 + */ + @PreAuthorize("@ss.hasPermi('information:delivery:export')") + @Log(title = "配送系统物料字典", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DeliveryMtd deliveryMtd) + { + List list = deliveryMtdService.selectDeliveryMtdList(deliveryMtd); + ExcelUtil util = new ExcelUtil(DeliveryMtd.class); + util.exportExcel(response, list, "配送系统物料字典数据"); + } + + @PreAuthorize("@ss.hasPermi('information:delivery:import')") + @Log(title = "配送系统物料字典", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public AjaxResult importData(@RequestParam("file") MultipartFile file) throws Exception + { + if (file == null || file.isEmpty()) { + return AjaxResult.error("导入文件不能为空"); + } + ExcelUtil util = new ExcelUtil<>(DeliveryMtd.class); + List list = util.importExcel(file.getInputStream()); + int handled = deliveryMtdService.importDeliveryMtd(list, getUsername()); + return success("导入成功,共处理 " + handled + " 条"); + } + + /** + * 获取配送系统物料字典详细信息 + */ + @PreAuthorize("@ss.hasPermi('information:delivery:query')") + @GetMapping(value = "/{Id}") + public AjaxResult getInfo(@PathVariable("Id") Long Id) + { + return success(deliveryMtdService.selectDeliveryMtdById(Id)); + } + + /** + * 新增配送系统物料字典 + */ + @PreAuthorize("@ss.hasPermi('information:delivery:add')") + @Log(title = "配送系统物料字典", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DeliveryMtd deliveryMtd) + { + return toAjax(deliveryMtdService.insertDeliveryMtd(deliveryMtd)); + } + + /** + * 修改配送系统物料字典 + */ + @PreAuthorize("@ss.hasPermi('information:delivery:edit')") + @Log(title = "配送系统物料字典", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DeliveryMtd deliveryMtd) + { + return toAjax(deliveryMtdService.updateDeliveryMtd(deliveryMtd)); + } + + /** + * 删除配送系统物料字典 + */ + @PreAuthorize("@ss.hasPermi('information:delivery:remove')") + @Log(title = "配送系统物料字典", businessType = BusinessType.DELETE) + @DeleteMapping("/{Ids}") + public AjaxResult remove(@PathVariable Long[] Ids) + { + return toAjax(deliveryMtdService.deleteDeliveryMtdByIds(Ids)); + } +} diff --git a/src/main/java/com/zg/project/information/controller/MtdController.java b/src/main/java/com/zg/project/information/controller/MtdController.java index 4fdf202..3c0bdeb 100644 --- a/src/main/java/com/zg/project/information/controller/MtdController.java +++ b/src/main/java/com/zg/project/information/controller/MtdController.java @@ -4,14 +4,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.zg.framework.aspectj.lang.annotation.Log; import com.zg.framework.aspectj.lang.enums.BusinessType; import com.zg.project.information.domain.Mtd; @@ -20,6 +13,7 @@ import com.zg.framework.web.controller.BaseController; import com.zg.framework.web.domain.AjaxResult; import com.zg.common.utils.poi.ExcelUtil; import com.zg.framework.web.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 物料字典Controller @@ -59,6 +53,23 @@ public class MtdController extends BaseController util.exportExcel(response, list, "物料字典数据"); } + /** + * Excel 导入数据(存在则更新,不存在则新增) + */ + @PreAuthorize("@ss.hasPermi('information:mtd:import')") + @Log(title = "物料字典", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public AjaxResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", defaultValue = "true") boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil<>(Mtd.class); + List mtdList = util.importExcel(file.getInputStream()); + String operName = getUsername(); +// String operName = "大爷的!!!"; + String message = mtdService.importMtd(mtdList, updateSupport, operName); + return success(message); + } + /** * 获取物料字典详细信息 */ @@ -101,4 +112,13 @@ public class MtdController extends BaseController { return toAjax(mtdService.deleteMtdByIds(Ids)); } + + @PreAuthorize("@ss.hasPermi('information:mtd:sync')") + @Log(title = "物料字典", businessType = BusinessType.OTHER) + @GetMapping("/syncFromPlan") + public AjaxResult syncFromPlan() { + String operName = getUsername(); + int inserted = mtdService.syncFromGysPlan(operName); + return success("同步完成:新增 " + inserted + " 条。"); + } } diff --git a/src/main/java/com/zg/project/information/domain/DeliveryMtd.java b/src/main/java/com/zg/project/information/domain/DeliveryMtd.java new file mode 100644 index 0000000..25b7e49 --- /dev/null +++ b/src/main/java/com/zg/project/information/domain/DeliveryMtd.java @@ -0,0 +1,132 @@ +package com.zg.project.information.domain; + +import java.math.BigDecimal; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.zg.framework.aspectj.lang.annotation.Excel; +import com.zg.framework.web.domain.BaseEntity; + +/** + * 配送系统物料字典对象 delivery_mtd + * + * @author zg + * @date 2025-10-24 + */ +public class DeliveryMtd extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long Id; + + /** 物料号 */ + @Excel(name = "物料号") + private String wlNo; + + /** 物料描述 */ + @Excel(name = "物料描述") + private String wlMs; + + /** 单位 */ + @Excel(name = "单位") + private String dw; + + /** 单件重量(kg) */ + @Excel(name = "单件重量(kg)") + private BigDecimal weightKg; + + /** 单件体积(立方米) */ + @Excel(name = "单件体积(立方米)") + private BigDecimal volumeM3; + + /** 是否删除(0正常 1删除) */ + @Excel(name = "是否删除(0正常 1删除)") + private String isDelete; + + public void setId(Long Id) + { + this.Id = Id; + } + + public Long getId() + { + return Id; + } + + public void setWlNo(String wlNo) + { + this.wlNo = wlNo; + } + + public String getWlNo() + { + return wlNo; + } + + public void setWlMs(String wlMs) + { + this.wlMs = wlMs; + } + + public String getWlMs() + { + return wlMs; + } + + public void setDw(String dw) + { + this.dw = dw; + } + + public String getDw() + { + return dw; + } + + public void setWeightKg(BigDecimal weightKg) + { + this.weightKg = weightKg; + } + + public BigDecimal getWeightKg() + { + return weightKg; + } + + public void setVolumeM3(BigDecimal volumeM3) + { + this.volumeM3 = volumeM3; + } + + public BigDecimal getVolumeM3() + { + return volumeM3; + } + + public void setIsDelete(String isDelete) + { + this.isDelete = isDelete; + } + + public String getIsDelete() + { + return isDelete; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("Id", getId()) + .append("wlNo", getWlNo()) + .append("wlMs", getWlMs()) + .append("dw", getDw()) + .append("weightKg", getWeightKg()) + .append("volumeM3", getVolumeM3()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("isDelete", getIsDelete()) + .toString(); + } +} diff --git a/src/main/java/com/zg/project/information/mapper/DeliveryMtdMapper.java b/src/main/java/com/zg/project/information/mapper/DeliveryMtdMapper.java new file mode 100644 index 0000000..2ba17ba --- /dev/null +++ b/src/main/java/com/zg/project/information/mapper/DeliveryMtdMapper.java @@ -0,0 +1,68 @@ +package com.zg.project.information.mapper; + +import java.util.List; +import com.zg.project.information.domain.DeliveryMtd; + +/** + * 配送系统物料字典Mapper接口 + * + * @author zg + * @date 2025-10-24 + */ +public interface DeliveryMtdMapper +{ + /** + * 查询配送系统物料字典 + * + * @param Id 配送系统物料字典主键 + * @return 配送系统物料字典 + */ + public DeliveryMtd selectDeliveryMtdById(Long Id); + + /** + * 查询配送系统物料字典列表 + * + * @param deliveryMtd 配送系统物料字典 + * @return 配送系统物料字典集合 + */ + public List selectDeliveryMtdList(DeliveryMtd deliveryMtd); + + /** + * 新增配送系统物料字典 + * + * @param deliveryMtd 配送系统物料字典 + * @return 结果 + */ + public int insertDeliveryMtd(DeliveryMtd deliveryMtd); + + /** + * 修改配送系统物料字典 + * + * @param deliveryMtd 配送系统物料字典 + * @return 结果 + */ + public int updateDeliveryMtd(DeliveryMtd deliveryMtd); + + /** + * 删除配送系统物料字典 + * + * @param Id 配送系统物料字典主键 + * @return 结果 + */ + public int deleteDeliveryMtdById(Long Id); + + /** + * 批量删除配送系统物料字典 + * + * @param Ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDeliveryMtdByIds(Long[] Ids); + + /** + * 批量插入数据 + * @param clean + * @return + */ + int batchUpsertDeliveryMtd(List clean); +} diff --git a/src/main/java/com/zg/project/information/mapper/MtdMapper.java b/src/main/java/com/zg/project/information/mapper/MtdMapper.java index bc5bded..95b4c89 100644 --- a/src/main/java/com/zg/project/information/mapper/MtdMapper.java +++ b/src/main/java/com/zg/project/information/mapper/MtdMapper.java @@ -65,4 +65,11 @@ public interface MtdMapper * @return */ String selectWlmsByWlbh(String materialCode); + + /** + * 根据物料编码查询物料信息 + * @param + * @return + */ + Mtd selectMtdByMid(String trim); } diff --git a/src/main/java/com/zg/project/information/service/IDeliveryMtdService.java b/src/main/java/com/zg/project/information/service/IDeliveryMtdService.java new file mode 100644 index 0000000..386f21f --- /dev/null +++ b/src/main/java/com/zg/project/information/service/IDeliveryMtdService.java @@ -0,0 +1,69 @@ +package com.zg.project.information.service; + +import java.util.List; +import com.zg.project.information.domain.DeliveryMtd; + +/** + * 配送系统物料字典Service接口 + * + * @author zg + * @date 2025-10-24 + */ +public interface IDeliveryMtdService +{ + /** + * 查询配送系统物料字典 + * + * @param Id 配送系统物料字典主键 + * @return 配送系统物料字典 + */ + public DeliveryMtd selectDeliveryMtdById(Long Id); + + /** + * 查询配送系统物料字典列表 + * + * @param deliveryMtd 配送系统物料字典 + * @return 配送系统物料字典集合 + */ + public List selectDeliveryMtdList(DeliveryMtd deliveryMtd); + + /** + * 新增配送系统物料字典 + * + * @param deliveryMtd 配送系统物料字典 + * @return 结果 + */ + public int insertDeliveryMtd(DeliveryMtd deliveryMtd); + + /** + * 修改配送系统物料字典 + * + * @param deliveryMtd 配送系统物料字典 + * @return 结果 + */ + public int updateDeliveryMtd(DeliveryMtd deliveryMtd); + + /** + * 批量删除配送系统物料字典 + * + * @param Ids 需要删除的配送系统物料字典主键集合 + * @return 结果 + */ + public int deleteDeliveryMtdByIds(Long[] Ids); + + /** + * 删除配送系统物料字典信息 + * + * @param Id 配送系统物料字典主键 + * @return 结果 + */ + public int deleteDeliveryMtdById(Long Id); + + /** + * 批量导入(UPSERT,依赖 wl_no 唯一索引) + * @param list 数据 + * @param operator 操作人 + * @return 处理条数 + */ + int importDeliveryMtd(List list, String operator); +} diff --git a/src/main/java/com/zg/project/information/service/IMtdService.java b/src/main/java/com/zg/project/information/service/IMtdService.java index 7ab81fd..07781de 100644 --- a/src/main/java/com/zg/project/information/service/IMtdService.java +++ b/src/main/java/com/zg/project/information/service/IMtdService.java @@ -58,4 +58,17 @@ public interface IMtdService * @return 结果 */ public int deleteMtdById(Long Id); + + /** + * 导入物料字典数据 + * + * @param mtdList 物料字典数据列表 + * @param updateSupport 是否更新已经存在的物料字典数据 + * @param operName 操作人员 + * @return 结果 + */ + String importMtd(List mtdList, boolean updateSupport, String operName); + + int syncFromGysPlan(String operName); + } diff --git a/src/main/java/com/zg/project/information/service/impl/DeliveryMtdServiceImpl.java b/src/main/java/com/zg/project/information/service/impl/DeliveryMtdServiceImpl.java new file mode 100644 index 0000000..54de0ba --- /dev/null +++ b/src/main/java/com/zg/project/information/service/impl/DeliveryMtdServiceImpl.java @@ -0,0 +1,132 @@ +package com.zg.project.information.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.zg.common.exception.ServiceException; +import com.zg.common.utils.DateUtils; +import com.zg.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zg.project.information.mapper.DeliveryMtdMapper; +import com.zg.project.information.domain.DeliveryMtd; +import com.zg.project.information.service.IDeliveryMtdService; + +/** + * 配送系统物料字典Service业务层处理 + * + * @author zg + * @date 2025-10-24 + */ +@Service +public class DeliveryMtdServiceImpl implements IDeliveryMtdService +{ + @Autowired + private DeliveryMtdMapper deliveryMtdMapper; + + /** + * 查询配送系统物料字典 + * + * @param Id 配送系统物料字典主键 + * @return 配送系统物料字典 + */ + @Override + public DeliveryMtd selectDeliveryMtdById(Long Id) + { + return deliveryMtdMapper.selectDeliveryMtdById(Id); + } + + /** + * 查询配送系统物料字典列表 + * + * @param deliveryMtd 配送系统物料字典 + * @return 配送系统物料字典 + */ + @Override + public List selectDeliveryMtdList(DeliveryMtd deliveryMtd) + { + return deliveryMtdMapper.selectDeliveryMtdList(deliveryMtd); + } + + /** + * 新增配送系统物料字典 + * + * @param deliveryMtd 配送系统物料字典 + * @return 结果 + */ + @Override + public int insertDeliveryMtd(DeliveryMtd deliveryMtd) + { + deliveryMtd.setCreateTime(DateUtils.getNowDate()); + return deliveryMtdMapper.insertDeliveryMtd(deliveryMtd); + } + + /** + * 修改配送系统物料字典 + * + * @param deliveryMtd 配送系统物料字典 + * @return 结果 + */ + @Override + public int updateDeliveryMtd(DeliveryMtd deliveryMtd) + { + deliveryMtd.setUpdateTime(DateUtils.getNowDate()); + return deliveryMtdMapper.updateDeliveryMtd(deliveryMtd); + } + + /** + * 批量删除配送系统物料字典 + * + * @param Ids 需要删除的配送系统物料字典主键 + * @return 结果 + */ + @Override + public int deleteDeliveryMtdByIds(Long[] Ids) + { + return deliveryMtdMapper.deleteDeliveryMtdByIds(Ids); + } + + /** + * 删除配送系统物料字典信息 + * + * @param Id 配送系统物料字典主键 + * @return 结果 + */ + @Override + public int deleteDeliveryMtdById(Long Id) + { + return deliveryMtdMapper.deleteDeliveryMtdById(Id); + } + + @Override + public int importDeliveryMtd(List list, String operator) + { + if (list == null || list.isEmpty()) { + throw new ServiceException("导入数据为空"); + } + // 清洗与校验 + List clean = new ArrayList<>(list.size()); + for (DeliveryMtd m : list) { + if (m == null) continue; + if (StringUtils.isEmpty(m.getWlNo())) { + // wlNo 必填,缺失则跳过 + continue; + } + m.setWlNo(m.getWlNo().trim()); + if (StringUtils.isEmpty(m.getIsDelete())) m.setIsDelete("0"); + + // 写入操作人与时间 + m.setUpdateBy(operator); + m.setUpdateTime(DateUtils.getNowDate()); + if (m.getCreateBy() == null) m.setCreateBy(operator); + if (m.getCreateTime() == null) m.setCreateTime(DateUtils.getNowDate()); + + clean.add(m); + } + if (clean.isEmpty()) { + throw new ServiceException("有效导入数据为空(缺少 wlNo)"); + } + // 批量 UPSERT(依赖 delivery_mtd.wl_no 唯一索引) + return deliveryMtdMapper.batchUpsertDeliveryMtd(clean); + } +} diff --git a/src/main/java/com/zg/project/information/service/impl/MtdServiceImpl.java b/src/main/java/com/zg/project/information/service/impl/MtdServiceImpl.java index 7f03797..ffe32f0 100644 --- a/src/main/java/com/zg/project/information/service/impl/MtdServiceImpl.java +++ b/src/main/java/com/zg/project/information/service/impl/MtdServiceImpl.java @@ -1,11 +1,21 @@ package com.zg.project.information.service.impl; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +import com.zg.common.exception.ServiceException; +import com.zg.project.wisdom.domain.vo.PlanToMtdVO; +import com.zg.project.wisdom.mapper.GysJhMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import com.zg.project.information.mapper.MtdMapper; import com.zg.project.information.domain.Mtd; import com.zg.project.information.service.IMtdService; +import org.springframework.transaction.annotation.Transactional; /** * 物料字典Service业务层处理 @@ -19,6 +29,13 @@ public class MtdServiceImpl implements IMtdService @Autowired private MtdMapper mtdMapper; + // 注入若依内置线程池 + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Autowired + private GysJhMapper gysJhMapper; + /** * 查询物料字典 * @@ -90,4 +107,105 @@ public class MtdServiceImpl implements IMtdService { return mtdMapper.deleteMtdById(Id); } + + /** + * 导入 Excel 数据(存在则更新,不存在则新增) + */ + @Override + public String importMtd(List mtdList, boolean updateSupport, String operName) + { + if (mtdList == null || mtdList.isEmpty()) { + throw new ServiceException("导入数据不能为空!"); + } + + int nThreads = 3; // 启动3个线程 + int size = mtdList.size(); + int chunk = (size + nThreads - 1) / nThreads; + + AtomicInteger insertCount = new AtomicInteger(0); + AtomicInteger updateCount = new AtomicInteger(0); + AtomicInteger failCount = new AtomicInteger(0); + ConcurrentLinkedQueue errorMsgs = new ConcurrentLinkedQueue<>(); + + List> futures = new ArrayList<>(); + + for (int t = 0; t < nThreads; t++) { + int from = t * chunk; + int to = Math.min(from + chunk, size); + if (from >= to) break; + + final List part = mtdList.subList(from, to); + final int startRow = 2 + from; + + CompletableFuture future = CompletableFuture.runAsync(() -> { + for (int i = 0; i < part.size(); i++) { + Mtd row = part.get(i); + int rowNum = startRow + i; + try { + if (row.getMid() == null || row.getMid().trim().isEmpty()) { + failCount.incrementAndGet(); + errorMsgs.add("第" + rowNum + "行:物料号为空;"); + continue; + } + + String mid = row.getMid().trim(); + Mtd exist = mtdMapper.selectMtdByMid(mid); + if (exist == null) { + row.setCreateBy(operName); + mtdMapper.insertMtd(row); + insertCount.incrementAndGet(); + } else if (updateSupport) { + exist.setDesMat(row.getDesMat()); + exist.setGrp(row.getGrp()); + exist.setUnt(row.getUnt()); + exist.setUprc(row.getUprc()); + exist.setBtpe(row.getBtpe()); + exist.setMtpe(row.getMtpe()); + exist.setStpe(row.getStpe()); + exist.setUpdateBy(operName); + mtdMapper.updateMtd(exist); + updateCount.incrementAndGet(); + } else { + failCount.incrementAndGet(); + errorMsgs.add("第" + rowNum + "行:物料号(" + mid + ")已存在,跳过;"); + } + } catch (Exception e) { + failCount.incrementAndGet(); + errorMsgs.add("第" + rowNum + "行导入异常:" + e.getMessage() + ";"); + } + } + }, threadPoolTaskExecutor); + futures.add(future); + } + + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + + String summary = String.format("导入完成:新增 %d 条,更新 %d 条,失败 %d 条。", + insertCount.get(), updateCount.get(), failCount.get()); + if (failCount.get() > 0) { + StringBuilder sb = new StringBuilder(summary).append(" 失败详情:"); + errorMsgs.forEach(sb::append); + throw new ServiceException(sb.toString()); + } + return summary; + } + + @Override + public int syncFromGysPlan(String operName) { + // 查出“供应计划里有、物料字典里没有”的物料(去重) + List needAdd = gysJhMapper.selectMissingMtdItems(); + if (needAdd == null || needAdd.isEmpty()) return 0; + + int cnt = 0; + for (PlanToMtdVO it : needAdd) { + Mtd m = new Mtd(); + m.setMid(it.getWlNo()); // 物料号 + m.setDesMat(it.getWlMs()); // 物料描述 + m.setUnt(it.getDw()); // 单位 + m.setUprc(it.getHtDj() == null ? null : it.getHtDj().toPlainString()); // 单价(字符串) + m.setCreateBy(operName); + cnt += mtdMapper.insertMtd(m); + } + return cnt; + } } diff --git a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java index bc86c38..276a86a 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -251,6 +251,7 @@ public class RkInfoController extends BaseController List list = rkInfoService.selectAllRkInfo(dto); return getDataTable(list); + } } diff --git a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java index a86bf69..48ca66f 100644 --- a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java +++ b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java @@ -251,6 +251,14 @@ public class RkInfo extends BaseEntity @TableField(exist = false) private Date lyEndTime; + /** 一次封样号 */ + @Excel(name = "一次封样号") + private String fycde1; + + /** 二次封样号 */ + @Excel(name = "二次封样号") + private String fycde2; + /** 是否删除(0 表示正常,1 表示已删除) */ private String isDelete; @@ -473,6 +481,23 @@ public class RkInfo extends BaseEntity public void setAuditResult(String auditResult) { this.auditResult = auditResult; } + + public String getFycde1() { + return fycde1; + } + + public void setFycde1(String fycde1) { + this.fycde1 = fycde1; + } + + public String getFycde2() { + return fycde2; + } + + public void setFycde2(String fycde2) { + this.fycde2 = fycde2; + } + public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } @@ -547,6 +572,8 @@ public class RkInfo extends BaseEntity .append("isChukuList", getIsChukuList()) .append("lyStartTime", getLyStartTime()) .append("lyEndTime", getLyEndTime()) + .append("fycde1", getFycde1()) + .append("fycde2", getFycde2()) .append("isDelete", getIsDelete()) .toString(); } diff --git a/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java b/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java index 4f583d8..9266116 100644 --- a/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java +++ b/src/main/java/com/zg/project/wisdom/domain/dto/PcRkInfoItemDTO.java @@ -73,6 +73,12 @@ public class PcRkInfoItemDTO { /** 实物 ID */ private String entityId; + /*一次封样号*/ + private String fycde1; + + /*二次封样号*/ + private String fycde2; + /** 备注 */ private String remark; diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java new file mode 100644 index 0000000..bbf63ba --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java @@ -0,0 +1,13 @@ +package com.zg.project.wisdom.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +@Data +public class PlanToMtdVO { + private String wlNo; // 物料号 + private String wlMs; // 物料描述 + private String dw; // 单位 + private BigDecimal htDj; // 合同单价 + +} \ No newline at end of file diff --git a/src/main/java/com/zg/project/wisdom/mapper/GysJhMapper.java b/src/main/java/com/zg/project/wisdom/mapper/GysJhMapper.java index 529e3d0..e5ff29b 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/GysJhMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/GysJhMapper.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Set; import com.zg.project.wisdom.domain.GysJh; +import com.zg.project.wisdom.domain.vo.PlanToMtdVO; import org.apache.ibatis.annotations.Param; /** @@ -114,4 +115,12 @@ public interface GysJhMapper * @param realQty */ void decreaseJhQtyById(@Param("id") Long id, @Param("realQty") BigDecimal realQty); + + /** + * 查询缺失的物料 + * @return + */ + List selectMissingMtdItems(); + + } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java index 711426c..b630adf 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java @@ -343,6 +343,8 @@ public class RkInfoServiceImpl implements IRkInfoService rk.setCreateTime(now); rk.setIsDelete("0"); rk.setGysJhId(item.getGysJhId()); + rk.setFycde1(item.getFycde1()); + rk.setFycde2(item.getFycde2()); if (needAudit) { rk.setStatus("0"); // 待审核 @@ -758,6 +760,9 @@ public class RkInfoServiceImpl implements IRkInfoService throw new ServiceException("匹配失败:缺少场景ID"); } + //根据任务ID修改任务状态 + taskMapper.updateStatus(dto.getTaskId(), "1"); + // 自动盘点必须有设备 ID String deviceId = dto.getDeviceId(); int scanType = dto.getScanType() != null ? dto.getScanType() : 0; // 扫描类型:0=手动盘点,1=自动盘点 diff --git a/src/main/resources/application-druid.yml b/src/main/resources/application-druid.yml index 88d57ed..150e0ad 100644 --- a/src/main/resources/application-druid.yml +++ b/src/main/resources/application-druid.yml @@ -7,9 +7,9 @@ spring: # 主库数据源 master: # url: jdbc:mysql://101.132.133.142:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - url: jdbc:mysql://192.168.1.20:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://192.168.1.20:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://192.168.1.192:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 -# url: jdbc:mysql://192.168.1.251:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://192.168.1.251:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # url: jdbc:mysql://localhost:3306/wisdom?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: shzg diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3644ec4..9f6d16c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -69,8 +69,8 @@ spring: redis: # 地址 # host: 101.132.133.142 - host: 192.168.1.20 -# host: 192.168.1.251 +# host: 192.168.1.20 + host: 192.168.1.251 # host: localhost # 端口,默认为6379 port: 6379 diff --git a/src/main/resources/mybatis/information/DeliveryMtdMapper.xml b/src/main/resources/mybatis/information/DeliveryMtdMapper.xml new file mode 100644 index 0000000..d068dc0 --- /dev/null +++ b/src/main/resources/mybatis/information/DeliveryMtdMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + select Id, wl_no, wl_ms, dw, weight_kg, volume_m3, create_by, create_time, update_by, update_time, is_delete from delivery_mtd + + + + + + + + insert into delivery_mtd + + wl_no, + wl_ms, + dw, + weight_kg, + volume_m3, + create_by, + create_time, + update_by, + update_time, + is_delete, + + + #{wlNo}, + #{wlMs}, + #{dw}, + #{weightKg}, + #{volumeM3}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{isDelete}, + + + + + update delivery_mtd + + wl_no = #{wlNo}, + wl_ms = #{wlMs}, + dw = #{dw}, + weight_kg = #{weightKg}, + volume_m3 = #{volumeM3}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + is_delete = #{isDelete}, + + where Id = #{Id} + + + + INSERT INTO delivery_mtd + (wl_no, wl_ms, dw, weight_kg, volume_m3, create_by, create_time, update_by, update_time, is_delete) + VALUES + + (#{item.wlNo}, #{item.wlMs}, #{item.dw}, #{item.weightKg}, #{item.volumeM3}, + #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.isDelete}) + + ON DUPLICATE KEY UPDATE + wl_ms = VALUES(wl_ms), + dw = VALUES(dw), + weight_kg = VALUES(weight_kg), + volume_m3 = VALUES(volume_m3), + update_by = VALUES(update_by), + update_time = VALUES(update_time), + is_delete = VALUES(is_delete) + + + + delete from delivery_mtd where Id = #{Id} + + + + delete from delivery_mtd where Id in + + #{Id} + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/information/MtdMapper.xml b/src/main/resources/mybatis/information/MtdMapper.xml index 6950c27..de2fa8c 100644 --- a/src/main/resources/mybatis/information/MtdMapper.xml +++ b/src/main/resources/mybatis/information/MtdMapper.xml @@ -45,6 +45,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE mid = #{materialCode} + + insert into mtd diff --git a/src/main/resources/mybatis/wisdom/GysJhMapper.xml b/src/main/resources/mybatis/wisdom/GysJhMapper.xml index e8b23c8..32777c1 100644 --- a/src/main/resources/mybatis/wisdom/GysJhMapper.xml +++ b/src/main/resources/mybatis/wisdom/GysJhMapper.xml @@ -93,6 +93,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + insert into gys_jh diff --git a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml index bf1862c..d115fca 100644 --- a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml @@ -1,7 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> @@ -57,9 +57,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + SELECT ri.id, @@ -73,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ri.team_code, ct.team_name, ri.ck_remark, ri.ly_time, + ri.fycde_1, ri.fycde_2, ri.borrow_time, ri.return_time, ri.xj, ri.xm_no, ri.xm_ms, ri.wl_no, ri.wl_ms, ri.xm_no_ck, ri.xm_ms_ck, ri.gys_no, ri.gys_mc, ri.jh_amt, ri.ht_dj, ri.sap_no, ri.xh, ri.gys_jh_id, @@ -90,6 +94,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN sys_user u ON ri.lihuo_y = u.user_id + + + SELECT + ri.id, + ri.bill_no, + ri.bill_no_ck, + ri.rk_type, + ri.wl_type, + ri.cangku, + ri.rk_time, + ri.lihuo_y, + ri.is_chuku, + ri.xj, + ri.xm_no, + ri.xm_ms, + ri.xm_no_ck, + ri.xm_ms_ck, + ri.gys_mc, + ri.wl_no, + ri.wl_ms, + ri.gys_no, + ri.sap_no, + ri.ck_type, + ri.ly_time, + ri.ck_lihuo_y, + ri.pcode, + ri.is_delete + FROM rk_info ri + + - UPDATE rk_info SET @@ -186,6 +219,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND ( ri.xm_no like concat('%', #{keyword}, '%') or ri.xm_ms like concat('%', #{keyword}, '%') + or ri.fycde_1 like concat('%', #{keyword}, '%') + or ri.fycde_2 like concat('%', #{keyword}, '%') or ri.wl_no like concat('%', #{keyword}, '%') or ri.wl_ms like concat('%', #{keyword}, '%') or ri.gys_no like concat('%', #{keyword}, '%') @@ -207,7 +242,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND ri.cangku like concat('%', #{cangku}, '%') - + + AND ri.fycde_1 like concat('%', #{fycde1}, '%') + + + AND ri.fycde_2 like concat('%', #{fycde2}, '%') + AND ri.id IN @@ -318,12 +358,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY ri.rk_time DESC - + - + SELECT COUNT(*) FROM rk_info WHERE is_delete = 0 AND is_chuku = 0 - @@ -577,12 +542,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - - - - update rk_info + UPDATE rk_info rk_type = #{rkType}, wl_type = #{wlType}, @@ -759,40 +720,62 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" lihuo_y = #{lihuoY}, is_chuku = #{isChuku}, is_borrowed = #{isBorrowed}, + bill_no = #{billNo}, + bill_no_ck = #{billNoCk}, + remark = #{remark}, xj = #{xj}, xm_no = #{xmNo}, xm_ms = #{xmMs}, xm_no_ck = #{xmNoCk}, xm_ms_ck = #{xmMsCk}, + wl_no = #{wlNo}, wl_ms = #{wlMs}, + gys_no = #{gysNo}, gys_mc = #{gysMc}, + jh_amt = #{jhAmt}, ht_dj = #{htDj}, sap_no = #{sapNo}, xh = #{xh}, + jh_qty = #{jhQty}, ht_qty = #{htQty}, dw = #{dw}, real_qty = #{realQty}, + pcode = #{pcode}, + pcode_id = #{pcodeId}, tray_code = #{trayCode}, entity_id = #{entityId}, + ck_lihuo_y = #{ckLihuoY}, ck_type = #{ckType}, + team_code = #{teamCode}, + ly_time = #{lyTime}, borrow_time = #{borrowTime}, return_time = #{returnTime}, ck_remark = #{ckRemark}, + + is_delivery = #{isDelivery}, has_moved = #{hasMoved}, + + + fycde_1 = #{fycde1}, + fycde_2 = #{fycde2}, + + + gys_jh_id = #{gysJhId}, + update_by = #{updateBy}, update_time = #{updateTime}, is_delete = #{isDelete}, - where id = #{id} + WHERE id = #{id} @@ -907,7 +890,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ri.is_delete = '0' AND ri.is_delivery = '1' - AND ri.bill_no_ck = #{billNoCk} @@ -921,7 +903,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND ri.status = #{status} - AND ri.ly_time = ]]> #{lyStartTime} @@ -929,7 +910,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND ri.ly_time #{lyEndTime} - AND ( ri.xm_no_ck LIKE CONCAT('%', #{keyword}, '%') @@ -953,34 +933,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" (ri.is_delete = '0' OR ri.is_delete = 0 OR ri.is_delete IS NULL) - - - AND ( - ri.xm_no LIKE CONCAT('%', #{keyword}, '%') - OR ri.xm_ms LIKE CONCAT('%', #{keyword}, '%') - OR ri.wl_no LIKE CONCAT('%', #{keyword}, '%') - OR ri.wl_ms LIKE CONCAT('%', #{keyword}, '%') - OR ri.gys_no LIKE CONCAT('%', #{keyword}, '%') - OR ri.gys_mc LIKE CONCAT('%', #{keyword}, '%') - OR ri.sap_no LIKE CONCAT('%', #{keyword}, '%') - OR ri.bill_no LIKE CONCAT('%', #{keyword}, '%') - OR ri.bill_no_ck LIKE CONCAT('%', #{keyword}, '%') - OR ri.ck_type LIKE CONCAT('%', #{keyword}, '%') - OR ri.pcode LIKE CONCAT('%', #{keyword}, '%') - ) - - - AND ri.is_chuku = #{isChuku} - AND ri.cangku = #{cangku} - AND ri.rk_time = ]]> #{startTime} @@ -988,15 +948,54 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND ri.rk_time #{endTime} - AND ri.ly_time = ]]> #{lyStartTime} AND ri.ly_time #{lyEndTime} + + + AND ri.xm_no LIKE CONCAT('%', #{xmNo}, '%') + + + AND ri.xm_ms LIKE CONCAT('%', #{xmMs}, '%') + + + AND ri.wl_no LIKE CONCAT('%', #{wlNo}, '%') + + + AND ri.wl_ms LIKE CONCAT('%', #{wlMs}, '%') + + + AND ri.gys_no LIKE CONCAT('%', #{gysNo}, '%') + + + AND ri.gys_mc LIKE CONCAT('%', #{gysMc}, '%') + + + AND ri.sap_no LIKE CONCAT('%', #{sapNo}, '%') + + + AND ri.bill_no LIKE CONCAT('%', #{billNo}, '%') + + + AND ri.bill_no_ck LIKE CONCAT('%', #{billNoCk}, '%') + + + AND ri.ck_type LIKE CONCAT('%', #{ckType}, '%') + + + AND ri.pcode LIKE CONCAT('%', #{pcode}, '%') + + + AND ri.fycde_1 LIKE CONCAT('%', #{fycde1}, '%') + + + AND ri.fycde_2 LIKE CONCAT('%', #{fycde2}, '%') + ORDER BY ri.create_time DESC, ri.id DESC - \ No newline at end of file +