From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsWendingxingKaocaJihuaZhouqiServiceImpl.java |  301 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 301 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsWendingxingKaocaJihuaZhouqiServiceImpl.java b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsWendingxingKaocaJihuaZhouqiServiceImpl.java
new file mode 100644
index 0000000..dad9322
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsWendingxingKaocaJihuaZhouqiServiceImpl.java
@@ -0,0 +1,301 @@
+package jnpf.limsService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import jnpf.audit.sdk.annotation.AuditLog;
+import jnpf.base.ActionResult;
+import jnpf.base.BillRuleApi;
+import jnpf.base.UserInfo;
+import jnpf.exception.DataException;
+import jnpf.limsEntity.*;
+import jnpf.limsMapper.*;
+import jnpf.limsService.LimsWendingxingKaocaJihuaZhouqiService;
+import jnpf.limsService.LimsQingyandanService;
+import jnpf.limsService.ZhiliangBiaozhunGuanliService;
+import jnpf.util.RandomUtil;
+import jnpf.util.StringUtil;
+import jnpf.util.UserProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+@Service
+public class LimsWendingxingKaocaJihuaZhouqiServiceImpl
+        implements LimsWendingxingKaocaJihuaZhouqiService {
+
+    private static final String JIANYAN_LIUSHUIHAO_RULE = "jianyan_liushuihao";
+
+    @Autowired
+    private LimsWendingxingKaocaJihuaBiangengMapper biangengMapper;
+
+    @Autowired
+    private LimsWendingxingKaocaJihuaBiangengZhouqiMapper biangengZhouqiMapper;
+
+    @Autowired
+    private LimsWendingxingKaocaJihuaZhouqiMapper jihuaZhouqiMapper;
+
+    @Autowired
+    private LimsQingyandanService qingyandanService;
+
+    @Autowired
+    private ZhiliangBiaozhunGuanliService zhiliangBiaozhunGuanliService;
+
+    @Autowired
+    private LimsWendingxingKaocaJihuaMapper jihuaMapper;
+
+    @Autowired
+    private YangpinGuanliMapper yangpinGuanliMapper;
+
+    @Autowired
+    private BillRuleApi billRuleApi;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @AuditLog(action = "EXECUTE", label = "绋冲畾鎬ц�冨療璁″垝妫�娴嬫墽琛�", bizType = "WENDINGXING",
+            bizCodeExpr = "#jihuaZhouqiId", bizCodeRequired = false,
+            targetTable = "lims_wendingxing_kaoca_jihua_zhouqi", targetIdExpr = "#jihuaZhouqiId",
+            diff = true, entityClass = LimsWendingxingKaocaJihuaZhouqiEntity.class)
+    public String executeJiance(String jihuaZhouqiId, String zhixingBizSign) {
+        UserInfo userInfo = UserProvider.getUser();
+        if (userInfo == null || !StringUtils.hasText(userInfo.getUserId())) {
+            throw new DataException("褰撳墠鏈櫥褰�");
+        }
+
+        Date now = new Date();
+        LambdaUpdateWrapper<LimsWendingxingKaocaJihuaZhouqiEntity> update = new LambdaUpdateWrapper<>();
+        update.eq(LimsWendingxingKaocaJihuaZhouqiEntity::getId, jihuaZhouqiId)
+                .and(wrapper -> wrapper.isNull(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteMark)
+                        .or().eq(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteMark, 0))
+                .and(wrapper -> wrapper.isNull(LimsWendingxingKaocaJihuaZhouqiEntity::getShifouYizhixing)
+                        .or().ne(LimsWendingxingKaocaJihuaZhouqiEntity::getShifouYizhixing, "yes"))
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getShifouYizhixing, "yes")
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getZhixingBizSign, zhixingBizSign)
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getZhixingShijian, now);
+        int updated = jihuaZhouqiMapper.update(null, update);
+        if (updated == 0) {
+            LambdaQueryWrapper<LimsWendingxingKaocaJihuaZhouqiEntity> existing =
+                    new LambdaQueryWrapper<>();
+            existing.eq(LimsWendingxingKaocaJihuaZhouqiEntity::getId, jihuaZhouqiId)
+                    .and(wrapper -> wrapper
+                            .isNull(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteMark)
+                            .or().eq(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteMark, 0));
+            if (jihuaZhouqiMapper.selectCount(existing) > 0) {
+                throw new DataException("绋冲畾鎬ц�冨療璁″垝鍛ㄦ湡宸叉墽琛岋紝璇峰嬁閲嶅鎿嶄綔");
+            }
+            throw new DataException("绋冲畾鎬ц�冨療璁″垝鍛ㄦ湡涓嶅瓨鍦�");
+        }
+
+        LimsWendingxingJianceZhixingVo jihuaZhouqi =
+                jihuaZhouqiMapper.selectJianceZhixing(jihuaZhouqiId);
+        if (jihuaZhouqi == null) {
+            throw new DataException("绋冲畾鎬ф牱鍝佽繕鏈彇鏍�");
+        }
+
+
+        QueryWrapper<LimsWendingxingKaocaJihuaEntity> query = new QueryWrapper<>();
+        query.eq("f_id", jihuaZhouqi.getKaocaJihuaId());
+        query.and(w -> w.isNull("f_delete_mark").or().ne("f_delete_mark", 1));
+        LimsWendingxingKaocaJihuaEntity jihuaEntity = jihuaMapper.selectOne(query);
+        if (jihuaEntity == null) {
+            throw new DataException("绋冲畾鎬ц鍒掍笉瀛樺湪");
+        }
+
+        ZhiliangBiaozhunGuanliEntity zhiliangBiaozhun =
+                zhiliangBiaozhunGuanliService.getById(jihuaZhouqi.getZhiliangBiaozhunId());
+        if (zhiliangBiaozhun == null) {
+            throw new DataException("绋冲畾鎬ф牱鍝佸叧鑱旂殑璐ㄩ噺鏍囧噯涓嶅瓨鍦�");
+        }
+
+        QueryWrapper<YangpinGuanliEntity> yangpinQuery = new QueryWrapper<>();
+        yangpinQuery.eq("f_id", zhiliangBiaozhun.getYangpinId());
+        yangpinQuery.and(w -> w.isNull("f_delete_mark").or().ne("f_delete_mark", 1));
+        YangpinGuanliEntity yangpinEntity = yangpinGuanliMapper.selectOne(yangpinQuery);
+        if (yangpinEntity == null) {
+            throw new DataException("鏍峰搧涓嶅瓨鍦�");
+        }
+
+        LimsQingyandanEntity qingyandan = buildQingyandan(jihuaZhouqi, userInfo, zhiliangBiaozhun, jihuaEntity, yangpinEntity);
+        if (!qingyandanService.save(qingyandan)) {
+            throw new DataException("绋冲畾鎬ц楠屽崟鐢熸垚澶辫触");
+        }
+        qingyandanService.wendingxingSubmit(qingyandan);
+
+        return qingyandan.getId();
+    }
+
+    private LimsQingyandanEntity buildQingyandan(LimsWendingxingJianceZhixingVo jihuaZhouqi,
+                                                  UserInfo userInfo,
+                                                 ZhiliangBiaozhunGuanliEntity zhiliangBiaozhun,
+                                                 LimsWendingxingKaocaJihuaEntity jihuaEntity,
+                                                 YangpinGuanliEntity yangpinEntity) {
+        LimsQingyandanEntity qingyandan = new LimsQingyandanEntity();
+        qingyandan.setId(RandomUtil.uuId());
+        qingyandan.setJianyanLiushuihao(nextJianyanLiushuihao());
+        qingyandan.setBizType(jihuaZhouqi.getLeixin());
+        qingyandan.setChanpinMingcheng(jihuaZhouqi.getYangpinMingcheng());
+        qingyandan.setChanpinId(jihuaZhouqi.getYangpinId());
+        qingyandan.setChanpinBianma(jihuaZhouqi.getYangpinBianhao());
+        qingyandan.setGuige(jihuaZhouqi.getGuige());
+        qingyandan.setChucunTiaojian(yangpinEntity.getCucunTiaojian());
+        qingyandan.setPihao(jihuaZhouqi.getPihao());
+        qingyandan.setJianceXiangmu(jihuaZhouqi.getJianchaXiangmuIds());
+        qingyandan.setQuyangren(jihuaZhouqi.getQuyangren());
+        qingyandan.setQuyangRiqi(jihuaZhouqi.getQuyangRiqi());
+        qingyandan.setQingyanRen(userInfo.getUserId());
+        qingyandan.setQingyanRiqi(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        qingyandan.setJianyanLiang(jihuaZhouqi.getShiquShuliang());
+        qingyandan.setJianyanLiangShiji(jihuaZhouqi.getShiquShuliang());
+        qingyandan.setJianceLiuyangLiang("0");
+        qingyandan.setJianceLiuyangLiangShiji("0");
+        qingyandan.setLiuyangLiang("0");
+        qingyandan.setLiuyangLiangShiji("0");
+        qingyandan.setQuyangDanwei(jihuaZhouqi.getYangpinDanwei());
+        qingyandan.setLiuyangDanwei(jihuaZhouqi.getYangpinDanwei());
+        qingyandan.setZhouqi(jihuaZhouqi.getZhouqi().toPlainString());
+        qingyandan.setZhouqiDanwei(jihuaZhouqi.getZhouqiDanwei());
+        qingyandan.setQingyanFenlei(QingyanFenlei.WENDINGXING.getCode());
+        qingyandan.setWendingxingJiluId(jihuaZhouqi.getKaocaJihuaId());
+        qingyandan.setQuyangStatus(BizStatus.FETCHED.getCode());
+        qingyandan.setBizStatus(BizStatus.CONFIRMED.getCode());
+        qingyandan.setJieyangStatus(BizStatus.PENDING_RECEIVE.getCode());
+        qingyandan.setJianceFangshi(JianceFangshi.QUANJIAN.getCode());
+        qingyandan.setJianyanBiaozhun(jihuaZhouqi.getZhiliangBiaozhunId());
+        qingyandan.setShifouShixiaoxingYaoqiu(zhiliangBiaozhun.getShifouShixiaoxingYaoqiu());
+        qingyandan.setCreatorUserId(userInfo.getUserId());
+        qingyandan.setCreatorTime(new Date());
+        qingyandan.setWendingxingZhouqiId(jihuaZhouqi.getId());
+        qingyandan.setWendingxingBianhao(jihuaEntity.getBianhao());
+        qingyandan.setChangqiFangzhiTiaojian(jihuaZhouqi.getChangqiFangzhiTiaojian());
+
+        return qingyandan;
+    }
+
+    private String nextJianyanLiushuihao() {
+        ActionResult<String> result = billRuleApi.getBillNumber(JIANYAN_LIUSHUIHAO_RULE);
+        String liushuihao = result == null ? null : result.getData();
+        if (StringUtil.isEmpty(liushuihao)) {
+            throw new DataException("妫�楠屾祦姘村彿鍙栧彿澶辫触锛氬崟鎹鍒橻" + JIANYAN_LIUSHUIHAO_RULE
+                    + "]涓嶅彲鐢紝璇风‘璁よ鍒欏凡閰嶇疆涓旂郴缁熸湇鍔″湪绾�");
+        }
+        return liushuihao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @AuditLog(action = "PLAN_CHANGE_SYNC", label = "鍚屾绋冲畾鎬ц�冨療璁″垝鍙樻洿鍛ㄦ湡", bizType = "WENDINGXING",
+            bizCodeExpr = "#result > 0 ? #flowId : ''",
+            targetTable = "lims_wendingxing_kaoca_jihua_zhouqi",
+            targetIdExpr = "T(jnpf.limsService.support.LimsAuditTargetIds).firstWendingxingChangedPeriod(#flowId, #flowTaskId)",
+            diff = true, entityClass = LimsWendingxingKaocaJihuaZhouqiEntity.class)
+    public int syncByFlow(String flowId, String flowTaskId) {
+        LambdaQueryWrapper<LimsWendingxingKaocaJihuaBiangengEntity> biangengQuery = new LambdaQueryWrapper<>();
+        biangengQuery.eq(LimsWendingxingKaocaJihuaBiangengEntity::getFlowId, flowId)
+                .eq(LimsWendingxingKaocaJihuaBiangengEntity::getFlowTaskId, flowTaskId);
+        LimsWendingxingKaocaJihuaBiangengEntity biangeng = biangengMapper.selectOne(biangengQuery);
+        if (biangeng == null) {
+            throw new DataException("鏈壘鍒板搴旂殑绋冲畾鎬ц�冨療璁″垝鍙樻洿鏁版嵁");
+        }
+
+        String biangengId = biangeng.getId();
+        LambdaQueryWrapper<LimsWendingxingKaocaJihuaBiangengZhouqiEntity> query = new LambdaQueryWrapper<>();
+        query.eq(LimsWendingxingKaocaJihuaBiangengZhouqiEntity::getBiangengId, biangengId)
+                .isNull(LimsWendingxingKaocaJihuaBiangengZhouqiEntity::getDeleteMark);
+        List<LimsWendingxingKaocaJihuaBiangengZhouqiEntity> biangengZhouqiList =
+                biangengZhouqiMapper.selectList(query);
+        if (biangengZhouqiList.isEmpty()) {
+            throw new DataException("鏈壘鍒板搴旂殑绋冲畾鎬ц�冨療璁″垝鍙樻洿鍛ㄦ湡鏁版嵁");
+        }
+
+        UserInfo userInfo = UserProvider.getUser();
+        if (userInfo == null || !StringUtils.hasText(userInfo.getUserId())) {
+            throw new DataException("褰撳墠鏈櫥褰�");
+        }
+
+        Date now = new Date();
+        Set<String> kaocaJihuaIds = new LinkedHashSet<>();
+        for (LimsWendingxingKaocaJihuaBiangengZhouqiEntity row : biangengZhouqiList) {
+            if (!StringUtils.hasText(row.getKaocaJihuaId())) {
+                throw new DataException("鍙樻洿鍛ㄦ湡鏈叧鑱旂ǔ瀹氭�ц�冨療璁″垝锛�" + row.getId());
+            }
+            kaocaJihuaIds.add(row.getKaocaJihuaId());
+        }
+
+        softDeleteJihuaZhouqi(kaocaJihuaIds, userInfo.getUserId(), now);
+        List<LimsWendingxingKaocaJihuaBiangengZhouqiEntity> insertList = new ArrayList<>();
+        for (LimsWendingxingKaocaJihuaBiangengZhouqiEntity row : biangengZhouqiList) {
+            if (StringUtils.hasText(row.getYuanjihuaZhouqiId())) {
+                restoreAndUpdateJihuaZhouqi(row);
+            } else {
+                insertList.add(row);
+            }
+        }
+        insertJihuaZhouqi(insertList);
+        return biangengZhouqiList.size();
+    }
+
+    private void softDeleteJihuaZhouqi(Set<String> kaocaJihuaIds, String userId, Date now) {
+        LambdaUpdateWrapper<LimsWendingxingKaocaJihuaZhouqiEntity> update = new LambdaUpdateWrapper<>();
+        update.in(LimsWendingxingKaocaJihuaZhouqiEntity::getKaocaJihuaId, kaocaJihuaIds)
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteMark, 1)
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteTime, now)
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteUserId, userId);
+        jihuaZhouqiMapper.update(null, update);
+    }
+
+    private void restoreAndUpdateJihuaZhouqi(LimsWendingxingKaocaJihuaBiangengZhouqiEntity source) {
+        LambdaUpdateWrapper<LimsWendingxingKaocaJihuaZhouqiEntity> update = new LambdaUpdateWrapper<>();
+        update.eq(LimsWendingxingKaocaJihuaZhouqiEntity::getId, source.getYuanjihuaZhouqiId())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getZhouqi, source.getZhouqi())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getZhouqiDanwei, source.getZhouqiDanwei())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getPihao, source.getPihao())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getJiahuaAnpaiRiqi, source.getJiahuaAnpaiRiqi())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getJianyanLeixingId, source.getJianyanLeixingId())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getJianchaXiangmuIds, source.getJianchaXiangmuIds())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getJianchaXiangmuMingcheng,
+                        source.getJianchaXiangmuMingcheng())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getYangpinDanwei, source.getYangpinDanwei())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getShiquShuliang, source.getShiquShuliang())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getKaocaJihuaId, source.getKaocaJihuaId())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getShifouJixuZhixing, source.getShifouJixuZhixing())
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteMark, null)
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteTime, null)
+                .set(LimsWendingxingKaocaJihuaZhouqiEntity::getDeleteUserId, null);
+        if (jihuaZhouqiMapper.update(null, update) != 1) {
+            throw new DataException("鍘熻鍒掑懆鏈熸暟鎹笉瀛樺湪锛�" + source.getYuanjihuaZhouqiId());
+        }
+    }
+
+    private void insertJihuaZhouqi(List<LimsWendingxingKaocaJihuaBiangengZhouqiEntity> sourceList) {
+        if (sourceList.isEmpty()) {
+            return;
+        }
+        List<LimsWendingxingKaocaJihuaZhouqiEntity> targetList = new ArrayList<>(sourceList.size());
+        for (LimsWendingxingKaocaJihuaBiangengZhouqiEntity source : sourceList) {
+            LimsWendingxingKaocaJihuaZhouqiEntity target = new LimsWendingxingKaocaJihuaZhouqiEntity();
+            target.setId(RandomUtil.uuId());
+            target.setKaocaJihuaId(source.getKaocaJihuaId());
+            target.setZhouqi(source.getZhouqi());
+            target.setZhouqiDanwei(source.getZhouqiDanwei());
+            target.setPihao(source.getPihao());
+            target.setJiahuaAnpaiRiqi(source.getJiahuaAnpaiRiqi());
+            target.setJianyanLeixingId(source.getJianyanLeixingId());
+            target.setJianchaXiangmuIds(source.getJianchaXiangmuIds());
+            target.setJianchaXiangmuMingcheng(source.getJianchaXiangmuMingcheng());
+            target.setYangpinDanwei(source.getYangpinDanwei());
+            target.setShiquShuliang(source.getShiquShuliang());
+            target.setShifouJixuZhixing(source.getShifouJixuZhixing());
+            targetList.add(target);
+        }
+        jihuaZhouqiMapper.insert(targetList);
+    }
+}

--
Gitblit v1.8.0