Преглед изворни кода

溯源码相关逻辑优化,批量导入溯源码和批次单号、开方校验

yjwang пре 2 дана
родитељ
комит
55f869a2ad
22 измењених фајлова са 431 додато и 246 уклоњено
  1. 2 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java
  2. 47 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  3. 17 17
      fs-common/src/main/java/com/fs/common/utils/txocr/TxOcrClient.java
  4. 28 0
      fs-service/src/main/java/com/fs/course/dto/FsOrderCodeNoteDTO.java
  5. 4 1
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreAfterSalesScrm.java
  6. 2 3
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrm.java
  7. 9 8
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreAfterSalesScrmMapper.java
  8. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java
  9. 6 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  10. 11 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  11. 4 1
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderParam.java
  12. 11 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  13. 32 29
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java
  14. 157 138
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  15. 36 9
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreVerifyCodeScrmServiceImpl.java
  16. 4 1
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreAfterSalesVO.java
  17. 4 2
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderVO.java
  18. 30 5
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  19. 1 12
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml
  20. 9 0
      fs-user-app/src/main/java/com/fs/app/controller/PatientController.java
  21. 11 13
      fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java
  22. 5 5
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 2 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java

@@ -118,7 +118,8 @@ public class FsStoreAfterSalesScrmController extends BaseController
 //        user.setPhone(ParseUtils.parsePhone(user.getPhone()));
         FsStoreOrderScrm order=fsStoreOrderService.selectFsStoreOrderByOrderCode(afterSales.getOrderCode());
         FsStoreScrm storeScrm = storeScrmService.selectFsStoreByStoreId(order.getStoreId());
-
+        afterSales.setVerifyCode(order.getVerifyCode() != null?order.getVerifyCode():null);
+        afterSales.setBatchNumber(order.getBatchNumber() != null?order.getBatchNumber():null);
         //获取溯源码相关数据
         List<FsStoreVerifyCodeScrm> verifyCodes = fsStoreVerifyCodeService.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().select(FsStoreVerifyCodeScrm::getVerifyCode,FsStoreVerifyCodeScrm::getProductId).eq(FsStoreVerifyCodeScrm::getOrderId, order.getId()));
         if(!verifyCodes.isEmpty()){

+ 47 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -13,6 +13,7 @@ import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.service.ICompanyMoneyLogsService;
+import com.fs.course.dto.FsOrderCodeNoteDTO;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.FsStoreOrderDf;
@@ -381,6 +382,52 @@ public class FsStoreHealthOrderScrmController extends BaseController {
         return util.importTemplateExcel("订单发货导入模板");
     }
 
+    @GetMapping("/importCodeNoteExpressTemplate")
+    public AjaxResult importCodeTemplate() {
+        ExcelUtil<FsOrderCodeNoteDTO> util = new ExcelUtil<>(FsOrderCodeNoteDTO.class);
+        return util.importTemplateExcel("订单溯源码’批号导入模板");
+    }
+
+    /**
+     * 订单发货批量导入
+     * @param file 导入文件
+     * @return R
+     * **/
+    @Log(title = "溯源码导入接口", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:exportItems:importCodeNoteExpress')")
+    @PostMapping("/importCodeNoteExpress")
+    public R importCodeNoteExpress(@RequestParam("file") MultipartFile file) {
+        // 1. 检查文件是否为空
+        if (file.isEmpty()) {
+            return R.error("上传的文件不能为空");
+        }
+        // 2. 检查文件大小
+        if (file.getSize() > MAX_FILE_SIZE) {
+            return R.error("文件大小不能超过5MB");
+        }
+        // 3. 检查文件扩展名
+        String fileName = file.getOriginalFilename();
+        if (fileName == null || !isValidExcelFile(fileName)) {
+            return R.error("请上传Excel文件(.xlsx或.xls格式)");
+        }
+
+        ExcelUtil<FsOrderCodeNoteDTO> util=new ExcelUtil<>(FsOrderCodeNoteDTO.class);
+        try {
+            List<FsOrderCodeNoteDTO> dtoList = util.importExcel(file.getInputStream());
+            if(!dtoList.isEmpty()){
+                if(dtoList.size() > 200){
+                    R.error("操作失败,导入数据不能大于200条!");
+                }
+                return fsStoreOrderService.importDeliveryNoteExpress(dtoList);
+            }else {
+                R.error("操作失败,导入数据不能小于1条!");
+            }
+        }catch (Exception e){
+            e.getStackTrace();
+        }
+        return R.ok();
+    }
+
     // 检查文件是否为有效的Excel文件
     private boolean isValidExcelFile(String fileName) {
         for (String ext : ALLOWED_EXCEL_EXTENSIONS) {

+ 17 - 17
fs-common/src/main/java/com/fs/common/utils/txocr/TxOcrClient.java

@@ -308,23 +308,23 @@ public class TxOcrClient  {
      * @return ClassifyDetectOCRResponse
      * @throws TencentCloudSDKException
      */
-//    public static ClassifyDetectOCRResponse classifyDetectOCR(String imageUrl){
-//        try{
-//            Credential cred = new Credential("AKIDviPyMZbRp24udCcpqjQxHOK4cx88ze6N", "97tVwEJE81sY0StDPPGukQ2ZvkU3QceY");
-//            HttpProfile httpProfile = new HttpProfile();
-//            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
-//            ClientProfile clientProfile = new ClientProfile();
-//            clientProfile.setHttpProfile(httpProfile);
-//            OcrClient client = new OcrClient(cred, "", clientProfile);
-//            IDCardOCRRequest req = new IDCardOCRRequest();
-//            req.setImageUrl(imageUrl);
-//            IDCardOCRResponse resp = client.IDCardOCR(req);
-//            System.out.println(AbstractModel.toJsonString(resp));
-//        } catch (TencentCloudSDKException e) {
-//            System.out.println(e.toString());
-//        }
-//        return null;
-//    }
+    public static ClassifyDetectOCRResponse classifyDetectOCR(String imageUrl){
+        try{
+            Credential cred = new Credential("AKIDviPyMZbRp24udCcpqjQxHOK4cx88ze6N", "97tVwEJE81sY0StDPPGukQ2ZvkU3QceY");
+            HttpProfile httpProfile = new HttpProfile();
+            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
+            ClientProfile clientProfile = new ClientProfile();
+            clientProfile.setHttpProfile(httpProfile);
+            OcrClient client = new OcrClient(cred, "", clientProfile);
+            IDCardOCRRequest req = new IDCardOCRRequest();
+            req.setImageUrl(imageUrl);
+            IDCardOCRResponse resp = client.IDCardOCR(req);
+            System.out.println(AbstractModel.toJsonString(resp));
+        } catch (TencentCloudSDKException e) {
+            System.out.println(e.toString());
+        }
+        return null;
+    }
 
 //    public static void main(String [] args) {
 //        ContainsResult contains = enterpriseLicenseOCR("https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/fs/20251119/c97e794b896f4066878913821a1e3287.jpg", "乙类非处方");

+ 28 - 0
fs-service/src/main/java/com/fs/course/dto/FsOrderCodeNoteDTO.java

@@ -0,0 +1,28 @@
+package com.fs.course.dto;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 订单发货下载模板
+ * **/
+@Data
+public class FsOrderCodeNoteDTO {
+    /**
+     * 系统订单号
+     * **/
+    @Excel(name = "系统订单号(必填)",width = 20,sort = 1)
+    private String orderNumber;
+
+    /**
+     * 溯源码
+     * **/
+    @Excel(name = "S编码(必填)",width = 20,sort = 1)
+    private String verifyCode;
+
+    /**
+     * 批次单号
+     * **/
+    @Excel(name = "P单号(必填)",width = 20,sort = 1)
+    private String batchNumber;
+}

+ 4 - 1
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreAfterSalesScrm.java

@@ -177,5 +177,8 @@ public class FsStoreAfterSalesScrm extends BaseEntity
     private String complaint;
 
     //核销溯源码
-    private String verifyCodes;
+    private String verifyCode;
+
+    //产品批次单号
+    private String batchNumber;
 }

+ 2 - 3
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrm.java

@@ -386,8 +386,7 @@ public class FsStoreOrderScrm extends BaseEntity
     //组合订单标识
     private String combinationOrderId;
 
-    //溯源码
-    @TableField(exist = false)
-    private String verifyCodes;
+    //产品批次单号多个用逗号分割
+    private String batchNumber;
 
 }

+ 9 - 8
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreAfterSalesScrmMapper.java

@@ -87,8 +87,8 @@ public interface FsStoreAfterSalesScrmMapper
     List<FsStoreAfterSalesQueryVO>  selectFsStoreAfterSalesListQuery(@Param("maps") FsStoreAfterSalesQueryParam storeAfterSalesParam);
 
     @Select({"<script> " +
-            "select DISTINCT s.*,o.delivery_status,o.delivery_id,u.phone as user_phone,c.company_name ," +
-            "cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,ssc.store_name as storeName,ssc.store_seq as storeSeq,ssc.merchant_id as merchantId,hps.serial_no,vc.verify_code AS verifyCodes  " +
+            "select DISTINCT s.*,o.delivery_status,o.delivery_id,u.phone as user_phone,c.company_name,o.verify_code,o.batch_number," +
+            "cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber,ssc.store_name as storeName,ssc.store_seq as storeSeq,ssc.merchant_id as merchantId,hps.serial_no " +
             "from fs_store_after_sales_scrm s INNER join fs_store_order_scrm o on o.order_code=s.order_code " +
             "inner join fs_store_order_item_scrm ois on o.id = ois.order_id " +
             "inner join fs_store_product_scrm p on  p.product_id = ois.product_id " +
@@ -96,7 +96,6 @@ public interface FsStoreAfterSalesScrmMapper
             "left join company_user cu on cu.user_id=s.company_user_id " +
             "left join fs_store_scrm ssc on o.store_id=ssc.store_id " +
             "left join fs_store_hospital580_prescription_scrm hps on hps.store_order_id = o.id " +
-            "LEFT JOIN fs_store_verify_code_scrm vc ON o.id = vc.order_id " +
             "<if test = 'maps.complaint != null and maps.complaint.trim() !=  \"\" '> " +
             "inner join fs_user_complaint uc on FIND_IN_SET(p.product_id, uc.product_ids) " +
             "</if>" +
@@ -143,8 +142,11 @@ public interface FsStoreAfterSalesScrmMapper
             "<if test = 'maps.consigneePhone != null and  maps.consigneePhone !=\"\"     '> " +
             "and o.user_phone like CONCAT('%',#{maps.consigneePhone},'%') " +
             "</if>" +
-            "          <if test=\"maps.verifyCodes != null and  maps.verifyCodes !=  '' \">\n" +
-            "                and vc.verify_code like concat('%', #{maps.verifyCodes}, '%')\n" +
+            "          <if test=\"maps.verifyCode != null and  maps.verifyCode !=  '' \">\n" +
+            "                and o.verify_code like concat('%', #{maps.verifyCode}, '%')\n" +
+            "            </if>" +
+            "          <if test=\"maps.batchNumber != null and  maps.batchNumber !=  '' \">\n" +
+            "                and o.batch_number like concat('%', #{maps.batchNumber}, '%')\n" +
             "            </if>" +
             "<if test = 'maps.endTime != null and maps.endTime != \"\"   '> " +
             " AND date_format(s.create_time,'%y%m%d') &lt;= date_format(#{maps.endTime},'%y%m%d') " +
@@ -275,12 +277,11 @@ public interface FsStoreAfterSalesScrmMapper
     List<FsStoreAfterSalesExcelVO> selectFsStoreAfterSalesExcelListVO(@Param("maps") FsStoreAfterSalesParam fsStoreAfterSales);
 
 
-    @Select("select so.*,st.store_name,us.nick_name,us.phone,fso.order_code, GROUP_CONCAT(cs.verify_code) AS verifyCodes " +
+    @Select("select so.*,st.store_name,us.nick_name,us.phone,fso.order_code,fso.verify_code,fso.batch_number " +
             "FROM fs_store_after_sales_scrm so " +
             "LEFT JOIN fs_store_scrm st ON so.store_id =st.store_id " +
             "LEFT JOIN fs_user us ON us.user_id=so.user_id " +
-            "LEFT JOIN fs_store_order_scrm fso ON fso.id=so.order_code " +
-            "LEFT JOIN fs_store_verify_code_scrm cs ON cs.order_id = fso.id " +
+            "LEFT JOIN fs_store_order_scrm fso ON fso.order_code=so.order_code " +
             "WHERE so.id=#{id} GROUP BY so.id, st.store_name, us.nick_name, us.phone, fso.order_code;")
     FsStoreAfterSalesVO selectFsStoreAfterSalesVOById(Long id);
 

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java

@@ -171,7 +171,7 @@ public interface FsStoreCartScrmMapper
     @Select({"<script> " +
             "select q.* FROM (" +
             "select c.*,p.product_type,p.product_name,p.image as product_image,v.price,v.sku as product_attr_name," +
-            "v.image as product_attr_image,v.stock,s.store_id,s.store_name,( SELECT COUNT(*) FROM fs_store_verify_code_scrm vc WHERE vc.product_id = p.product_id AND vc.outbound_status = 0 AND is_del = 0) AS num " +
+            "v.image as product_attr_image,v.stock,s.store_id,s.store_name " +
             "from fs_store_cart_scrm c " +
             "inner join fs_store_product_scrm p on p.product_id=c.product_id " +
             "inner join fs_store_product_attr_value_scrm v on v.id=c.product_attr_value_id " +

+ 6 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.api.param.OrderListParam;
 import com.fs.api.vo.OrderListVO;
 import com.fs.company.param.CompanyStatisticsParam;
+import com.fs.course.dto.FsOrderCodeNoteDTO;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.dto.FsStoreOrderAmountScrmStatsQueryDto;
@@ -1425,4 +1426,9 @@ public interface FsStoreOrderScrmMapper extends BaseMapper<FsStoreOrderScrm>
      * @return 超时订单列表
      */
     List<FsStoreOrderScrm> selectTimeoutUnpaidOrders(Map<String, Object> params);
+
+    /**
+     * 批量更新溯源码
+     * **/
+    void batchUpdateVerifyCodeByOrderCode(@Param("list") List<FsOrderCodeNoteDTO> list);
 }

+ 11 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -710,4 +710,15 @@ public interface FsStoreProductScrmMapper
      * 批量更新商品信息
      * **/
     int updateBatchById(@Param("updateProducts") List<FsStoreProductScrm> updateProducts);
+
+    /***
+     *查询商品信息
+     * @param productId 商品ID
+     * @return 商品信息
+     * **/
+    @Select("SELECT p.product_id, p.sales, p.stock AS availableStock, p.cate_id " +
+            "FROM fs_store_product_scrm p " +
+            "WHERE p.product_id = #{productId} " +
+            "FOR UPDATE;")
+    FsStoreProductScrm selectLockById(@Param("productId") Long productId);
 }

+ 4 - 1
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderParam.java

@@ -151,5 +151,8 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable
      private String complaint;
 
      //核销溯源码
-     private String verifyCodes;
+     private String verifyCode;
+
+     //产品批次号
+     private String batchNumber;
 }

+ 11 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java

@@ -10,6 +10,7 @@ import com.fs.api.param.OrderListParam;
 import com.fs.api.vo.OrderListVO;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyUser;
+import com.fs.course.dto.FsOrderCodeNoteDTO;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.erp.domain.ErpOrder;
 import com.fs.his.domain.FsStorePayment;
@@ -353,4 +354,14 @@ public interface IFsStoreOrderScrmService
     R receiveWaybillPush(String body);
 
     void cancelOrderReuse(FsStoreOrderScrm order);
+
+    /**
+     * 批量导入订单溯源码
+     * @param dtoList 订单数据
+     * **/
+    /**
+     * 批量导入更新微信订单发货状态
+     * @param dtoList 订单数据
+     * **/
+    R importDeliveryNoteExpress(List<FsOrderCodeNoteDTO> dtoList);
 }

+ 32 - 29
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java

@@ -164,13 +164,14 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
                     .isBuy(cartParam.getIsBuy())
                     .build();
             storeCart.setCreateTime(new Date());
-            if(cartParam.getType() == 1 && checkProductCater(storeCart.getProductId())){//加入校验
-                if(checkCarNumber(storeCart.getProductId(),storeCart.getCartNum())){
-                    return R.error("商品数量大于库存数量!");
-                }
-            }else {
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
-            }
+            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//            if(cartParam.getType() == 1 && checkProductCater(storeCart.getProductId())){//加入校验
+//                if(checkCarNumber(storeCart.getProductId(),storeCart.getCartNum())){
+//                    return R.error("商品数量大于库存数量!");
+//                }
+//            }else {
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//            }
             fsStoreCartMapper.insertFsStoreCart(storeCart);
             return R.ok().put("id",storeCart.getId());
 
@@ -196,13 +197,14 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
                         .isBuy(0)
                         .build();
                 storeCart.setCreateTime(new Date());
-                if(cartParam.getType() == 1 && checkProductCater(storeCart.getProductId())){//加入校验
-                    if(checkCarNumber(storeCart.getProductId(),storeCart.getCartNum())){
-                        return R.error("商品数量大于库存数量!");
-                    }
-                }else {
-                    checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
-                }
+                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                if(cartParam.getType() == 1 && checkProductCater(storeCart.getProductId())){//加入校验
+//                    if(checkCarNumber(storeCart.getProductId(),storeCart.getCartNum())){
+//                        return R.error("商品数量大于库存数量!");
+//                    }
+//                }else {
+//                    checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                }
                 fsStoreCartMapper.insertFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -210,13 +212,14 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
                 storeCart=cart.get(0);
                 storeCart.setCartNum(cartParam.getCartNum() + cart.get(0).getCartNum());
                 storeCart.setUpdateTime(new Date());
-                if(cartParam.getType() == 1 && checkProductCater(storeCart.getProductId())){//加入校验
-                    if(checkCarNumber(storeCart.getProductId(),storeCart.getCartNum())){
-                        return R.error("商品数量大于库存数量!");
-                    }
-                }else {
-                    checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
-                }
+                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                if(cartParam.getType() == 1 && checkProductCater(storeCart.getProductId())){//加入校验
+//                    if(checkCarNumber(storeCart.getProductId(),storeCart.getCartNum())){
+//                        return R.error("商品数量大于库存数量!");
+//                    }
+//                }else {
+//                    checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                }
                 fsStoreCartMapper.updateFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -434,13 +437,13 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
         return false;
     }
 
-    //校验商品类型
-    public boolean checkProductCater(Long productId){
-        FsStoreProductScrm product = fsStoreProductMapper.selectFsStoreProductById(productId);
-        if(product.getCateId().equals(202L) || product.getCateId().equals(232L) || product.getCateId().equals(201L) || product.getCateId().equals(233L)){
-            return false;
-        }
-        return true;
-    }
+//    //校验商品类型
+//    public boolean checkProductCater(Long productId){
+//        FsStoreProductScrm product = fsStoreProductMapper.selectFsStoreProductById(productId);
+//        if(product.getCateId().equals(202L) || product.getCateId().equals(232L) || product.getCateId().equals(201L) || product.getCateId().equals(233L)){
+//            return false;
+//        }
+//        return true;
+//    }
 
 }

+ 157 - 138
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -49,6 +49,7 @@ import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
+import com.fs.course.dto.FsOrderCodeNoteDTO;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.course.dto.OrderOpenIdTransDTO;
 import com.fs.erp.domain.*;
@@ -992,35 +993,24 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 }
                 fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
 
-                if(checkProductCater(vo.getProductId())){
-                    // ===================== 溯源码核心逻辑 ==================
-                    Integer buyCount = vo.getCartNum();
-                    Long productId = vo.getProductId();
-                    String productName = vo.getProductName();
-
-                    if (buyCount <= 0) {
-                        throw new ServiceException("商品[" + productName + "]购买数量不能为0");
-                    }
-
-                    //查询并锁定未出库溯源码带行锁
-                    List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
-                    if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
-                        String errorMsg = String.format("商品[%s]库存不足,需%s个,仅剩余%s个",
-                                productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
-                        throw new ServiceException(errorMsg);
-                    }
-
-                    for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
-                        code.setOutboundStatus(1L);
-                        code.setOrderId(storeOrder.getId());
-                        code.setOrderItemId(item.getItemId());
-                        code.setUpdateTime(new Date());
-                    }
-                    if (!availableVerifyCodes.isEmpty()) {
-                        verifyCodeService.updateBatchById(availableVerifyCodes);
-                    }
-                    // ===================== 溯源码逻辑END =====================
-                }
+//                //获取商品信息加入行锁
+//                FsStoreProductScrm product = fsStoreProductMapper.selectLockById(vo.getProductId());
+//                if(checkProductCater(product)){
+//                    // ===================== 溯源码核心逻辑 ==================
+//                    Integer buyCount = vo.getCartNum();
+//                    String productName = vo.getProductName();
+//
+//                    if (buyCount <= 0) {
+//                        throw new ServiceException("商品[" + productName + "]购买数量不能为0");
+//                    }
+//
+//                    if(checkProductInventory(product, buyCount)){
+//                                                String errorMsg = String.format("商品[%s]库存不足,需%s个,仅剩余%s个",
+//                                productName, buyCount, (product.getStock()));
+//                        throw new ServiceException(errorMsg);
+//                    }
+//                    // ===================== 溯源码逻辑END =====================
+//                }
                 listOrderItem.add(item);
             }
             if (listOrderItem.size() > 0) {
@@ -1048,11 +1038,10 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
                     config.setUnPayTime(4320);
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                } else {
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
                 }
-//                else {
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
-//                }
             } else {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
                     if(config == null){
@@ -1186,36 +1175,35 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             for (FsStoreOrderItemScrm item : items) {
                 item.setOrderId(order.getId());
                 fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
-
-                if(checkProductCater(item.getProductId())){
-                    // ===================== 溯源码核心逻辑 ==================
-                    Integer buyCount = item.getNum();
-                    Long productId = item.getProductId();
-                    String productName = productMap.get(productId) == null ? "商品" : productMap.get(productId);
-
-                    if (buyCount <= 0) {
-                        throw new ServiceException("商品[" + productName + "]购买数量不能为0");
-                    }
-
-                    //查询并锁定未出库溯源码带行锁
-                    List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
-                    if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
-                        String errorMsg = String.format("商品[%s]库存不足",
-                                productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
-                        throw new ServiceException(errorMsg);
-                    }
-
-                    for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
-                        code.setOutboundStatus(1L);
-                        code.setOrderId(order.getId());
-                        code.setOrderItemId(item.getItemId());
-                        code.setUpdateTime(new Date());
-                    }
-                    if (!availableVerifyCodes.isEmpty()) {
-                        verifyCodeService.updateBatchById(availableVerifyCodes);
-                    }
-                    // ===================== 溯源码逻辑END =====================
-                }
+//                if(checkProductCater(item.getProductId())){
+//                    // ===================== 溯源码核心逻辑 ==================
+//                    Integer buyCount = item.getNum();
+//                    Long productId = item.getProductId();
+//                    String productName = productMap.get(productId) == null ? "商品" : productMap.get(productId);
+//
+//                    if (buyCount <= 0) {
+//                        throw new ServiceException("商品[" + productName + "]购买数量不能为0");
+//                    }
+//
+//                    //查询并锁定未出库溯源码带行锁
+//                    List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
+//                    if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
+//                        String errorMsg = String.format("商品[%s]库存不足",
+//                                productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
+//                        throw new ServiceException(errorMsg);
+//                    }
+//
+//                    for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
+//                        code.setOutboundStatus(1L);
+//                        code.setOrderId(order.getId());
+//                        code.setOrderItemId(item.getItemId());
+//                        code.setUpdateTime(new Date());
+//                    }
+//                    if (!availableVerifyCodes.isEmpty()) {
+//                        verifyCodeService.updateBatchById(availableVerifyCodes);
+//                    }
+//                    // ===================== 溯源码逻辑END =====================
+//                }
 
             }
             fsStoreOrderLogsService.create(order.getId(), FsStoreOrderLogEnum.CREATE_ORDER.getValue(),
@@ -1781,11 +1769,11 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
                     config.setUnPayTime(4320);
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                }
+                else {
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
                 }
-//                else {
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
-//                }
             } else {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
                     if(config == null){
@@ -1793,9 +1781,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     }
                     config.setUnPayTime(4320);
                 }
-//                else {
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
-//                }
+                else {
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+                }
             }
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(storeOrder.getCreateTime());
@@ -2954,26 +2942,28 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         List<FsStoreOrderItemVO> orderItemVOS = fsStoreOrderItemMapper.selectFsStoreOrderItemListByOrderId(order.getId());
         List<Long> itemIds = new ArrayList<>();
         for (FsStoreOrderItemVO vo : orderItemVOS) {
-            if (checkProductCater(vo.getProductId())) {
-                itemIds.add(vo.getItemId());
-            }else {
-                productService.incProductStock(vo.getNum(), vo.getProductId()
-                        , vo.getProductAttrValueId());
-            }
+            productService.incProductStock(vo.getNum(), vo.getProductId()
+                    , vo.getProductAttrValueId());
+//            if (checkProductCater(vo.getProductId())) {
+//                itemIds.add(vo.getItemId());
+//            }else {
+//                productService.incProductStock(vo.getNum(), vo.getProductId()
+//                        , vo.getProductAttrValueId());
+//            }
         }
 
-        if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(itemIds)) {
-            List<FsStoreVerifyCodeScrm> codes = verifyCodeScrmMapper.selectList(
-                    new LambdaQueryWrapper<FsStoreVerifyCodeScrm>()
-                            .eq(FsStoreVerifyCodeScrm::getOrderId, order.getId())
-                            .in(FsStoreVerifyCodeScrm::getOrderItemId, itemIds)
-                            .eq(FsStoreVerifyCodeScrm::getIsDel, "0")
-            );
-            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(codes)) {
-                verifyCodeScrmMapper.updateOutboundStatus(codes);
-                log.info("订单{}共更新{}个核销码关联状态", order.getId(), codes.size());
-            }
-        }
+//        if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(itemIds)) {
+//            List<FsStoreVerifyCodeScrm> codes = verifyCodeScrmMapper.selectList(
+//                    new LambdaQueryWrapper<FsStoreVerifyCodeScrm>()
+//                            .eq(FsStoreVerifyCodeScrm::getOrderId, order.getId())
+//                            .in(FsStoreVerifyCodeScrm::getOrderItemId, itemIds)
+//                            .eq(FsStoreVerifyCodeScrm::getIsDel, "0")
+//            );
+//            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(codes)) {
+//                verifyCodeScrmMapper.updateOutboundStatus(codes);
+//                log.info("订单{}共更新{}个核销码关联状态", order.getId(), codes.size());
+//            }
+//        }
 
     }
 
@@ -4984,14 +4974,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             //检测库存
             //如果是美乳产品,发武汉仓库
             Integer meiruCount = 0;
-            Map<Long,Boolean> checkMap = new HashMap<>();
             for (FsStoreCartScrmQueryVO cart : carts) {
-                if(checkProductCater(cart.getProductId())){
-                    checkMap.put(cart.getProductId(),true);
-                }else {
-                    checkMap.put(cart.getProductId(),false);
-                    cartService.checkProductStocks(cart.getProductId(), cart.getProductAttrValueId(), cart.getCartNum());
-                }
+                cartService.checkProductStocks(cart.getProductId(), cart.getProductAttrValueId(), cart.getCartNum());
                 totalNum += cart.getCartNum();
                 integral = NumberUtil.add(integral,
                         NumberUtil.mul(cart.getCartNum(), cart.getIntegral()));
@@ -5154,35 +5138,35 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 }
                 fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
 
-                if(checkMap.get(vo.getProductId())){
-                    // ===================== 溯源码核心逻辑 ==================
-                    Integer buyCount = vo.getCartNum();
-                    Long productId = vo.getProductId();
-                    String productName = vo.getProductName();
-
-                    if (buyCount <= 0) {
-                        throw new ServiceException("商品[" + productName + "]购买数量不能为0");
-                    }
-
-                    //查询并锁定未出库溯源码带行锁
-                    List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
-                    if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
-                        String errorMsg = String.format("商品[%s]库存不足",
-                                productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
-                        throw new ServiceException(errorMsg);
-                    }
-
-                    for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
-                        code.setOutboundStatus(1L);
-                        code.setOrderId(storeOrder.getId());
-                        code.setOrderItemId(item.getItemId());
-                        code.setUpdateTime(new Date());
-                    }
-                    if (!availableVerifyCodes.isEmpty()) {
-                        verifyCodeService.updateBatchById(availableVerifyCodes);
-                    }
-                    // ===================== 溯源码逻辑END =====================
-                }
+//                if(checkMap.get(vo.getProductId())){
+//                    // ===================== 溯源码核心逻辑 ==================
+//                    Integer buyCount = vo.getCartNum();
+//                    Long productId = vo.getProductId();
+//                    String productName = vo.getProductName();
+//
+//                    if (buyCount <= 0) {
+//                        throw new ServiceException("商品[" + productName + "]购买数量不能为0");
+//                    }
+//
+//                    //查询并锁定未出库溯源码带行锁
+//                    List<FsStoreVerifyCodeScrm> availableVerifyCodes = verifyCodeMapper.selectUnOutboundVerifyCodesWithLock(productId, buyCount);
+//                    if (availableVerifyCodes == null || availableVerifyCodes.size() < buyCount) {
+//                        String errorMsg = String.format("商品[%s]库存不足",
+//                                productName, buyCount, (availableVerifyCodes == null ? 0 : availableVerifyCodes.size()));
+//                        throw new ServiceException(errorMsg);
+//                    }
+//
+//                    for (FsStoreVerifyCodeScrm code : availableVerifyCodes) {
+//                        code.setOutboundStatus(1L);
+//                        code.setOrderId(storeOrder.getId());
+//                        code.setOrderItemId(item.getItemId());
+//                        code.setUpdateTime(new Date());
+//                    }
+//                    if (!availableVerifyCodes.isEmpty()) {
+//                        verifyCodeService.updateBatchById(availableVerifyCodes);
+//                    }
+//                    // ===================== 溯源码逻辑END =====================
+//                }
                 listOrderItem.add(item);
             }
             if (listOrderItem.size() > 0) {
@@ -5210,22 +5194,22 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
                     config.setUnPayTime(4320);
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);//
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                }
+                else {
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
                 }
-//                else {
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
-//                }
             } else {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
                     if(config == null){
                         config = new com.fs.store.config.StoreConfig();
                     }
                     config.setUnPayTime(4320);
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
+                }
+                else {
+                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
                 }
-//                else {
-//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
-//                }
             }
             //添加支付到期时间
             Calendar calendar = Calendar.getInstance();
@@ -5927,12 +5911,47 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         }
     }
 
-    //校验商品类型
-    public boolean checkProductCater(Long productId){
-        FsStoreProductScrm product = fsStoreProductMapper.selectFsStoreProductById(productId);
-        if(product.getCateId().equals(202L) || product.getCateId().equals(232L) || product.getCateId().equals(201L) || product.getCateId().equals(233L)){
-            return false;
+    @Override
+    public R importDeliveryNoteExpress(List<FsOrderCodeNoteDTO> dtoList) {
+        int row =0;
+        Map<String,Integer> checkMap = new HashMap<>();
+        for (FsOrderCodeNoteDTO d : dtoList){
+            row++;
+            if(d.getOrderNumber() == null){
+                return R.error("操作失败,第"+row+"行,订单号为空!");
+            }
+
+            if(checkMap.containsKey(d.getOrderNumber())){
+                return R.error("操作失败,第"+row+"行,订单重复导入!");
+            }
         }
-        return true;
+        fsStoreOrderMapper.batchUpdateVerifyCodeByOrderCode(dtoList);
+        return R.ok();
     }
+
+//    //校验商品类型
+//    public boolean checkProductCater(FsStoreProductScrm product){
+//        if(product.getCateId().equals(202L) || product.getCateId().equals(232L) || product.getCateId().equals(201L) || product.getCateId().equals(233L)){
+//            return false;
+//        }
+//        return true;
+//    }
+//
+//    /**
+//     * 检查商品库存加入行锁
+//     * @param product 商品信息
+//     * @param buyCount 数量
+//     * @return 是否超出库存
+//     * **/
+//    public boolean checkProductInventory(FsStoreProductScrm product,Integer buyCount){
+//        if(product.getStock() < buyCount){
+//            return true;
+//        }
+//        //更新字段
+//        FsStoreProductScrm update = new FsStoreProductScrm();
+//        update.setProductId(product.getProductId());
+//        update.setSales(product.getSales() + buyCount);
+//        fsStoreProductMapper.updateFsStoreProduct(update);
+//        return false;
+//    }
 }

+ 36 - 9
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreVerifyCodeScrmServiceImpl.java

@@ -48,6 +48,9 @@ public class FsStoreVerifyCodeScrmServiceImpl extends ServiceImpl<FsStoreVerifyC
     @Autowired
     private IFsStoreVerifyCodeScrmService fsStoreVerifyCodeScrmService;
 
+    @Autowired
+    private FsStoreProductScrmMapper productScrmMapper;
+
     /**
      * 查询核销码
      *
@@ -78,19 +81,23 @@ public class FsStoreVerifyCodeScrmServiceImpl extends ServiceImpl<FsStoreVerifyC
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int insertFsStoreVerifyCodeScrm(FsStoreVerifyCodeScrm fsStoreVerifyCodeScrm) {
-        //验证核销码是否存在
-        if (baseMapper.selectCount(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getVerifyCode, fsStoreVerifyCodeScrm.getVerifyCode())) > 0) {
-            throw new ServiceException("操作失败,核销码:" + fsStoreVerifyCodeScrm.getVerifyCode() + "已存在");
-        }
-        //获取商品信息
-        FsStoreProductScrm product = fsStoreProductScrmMapper.selectFsStoreProductById(fsStoreVerifyCodeScrm.getProductId());
-        if(product == null){
+        //加锁查询商品
+        FsStoreProductScrm product = fsStoreProductScrmMapper.selectLockById(fsStoreVerifyCodeScrm.getProductId());
+        if (product == null) {
             throw new ServiceException("操作失败,商品不存在");
         }
-
-        fsStoreVerifyCodeScrm.setStoreId(product.getStoreId());//获取店铺id
+        // 设置核销码关联信息
+        fsStoreVerifyCodeScrm.setStoreId(product.getStoreId());
         fsStoreVerifyCodeScrm.setCreateTime(DateUtils.getNowDate());
+        //原子更新商品库存
+        FsStoreProductScrm updateProduct = new FsStoreProductScrm();
+        updateProduct.setProductId(product.getProductId());
+        updateProduct.setUpdateTime(new Date());
+        //新增核销码时库存+1
+        updateProduct.setStock(product.getStock() + 1);
+        fsStoreProductScrmMapper.updateFsStoreProduct(updateProduct);
         return baseMapper.insertFsStoreVerifyCodeScrm(fsStoreVerifyCodeScrm);
     }
 
@@ -129,6 +136,7 @@ public class FsStoreVerifyCodeScrmServiceImpl extends ServiceImpl<FsStoreVerifyC
                 .eq(FsStoreVerifyCodeScrm::getIsDel, NOT_DELETED);
         List<FsStoreVerifyCodeScrm> list = baseMapper.selectList(queryWrapper);
 
+        Set<Long> productIds = list.stream().map(FsStoreVerifyCodeScrm::getProductId).collect(Collectors.toSet());
 
         if (list.size() != ids.length) {
             log.error("核销码删除失败,数据不一致!入参ID数量:{},有效数据数量:{}", ids.length, list.size());
@@ -154,6 +162,18 @@ public class FsStoreVerifyCodeScrmServiceImpl extends ServiceImpl<FsStoreVerifyC
             return updateCount;
         }
 
+        for (Long productId : productIds) {
+            FsStoreProductScrm product = fsStoreProductScrmMapper.selectLockById(productId);
+            if (product == null) {
+                throw new ServiceException("商品ID:" + productId + "不存在,删除失败");
+            }
+            FsStoreProductScrm updateProduct = new FsStoreProductScrm();
+            updateProduct.setProductId(productId);
+            updateProduct.setUpdateTime(new Date());
+            updateProduct.setStock(product.getStock() - list.size());
+            fsStoreProductScrmMapper.updateFsStoreProduct(updateProduct);
+        }
+
         return 0;
     }
 
@@ -183,11 +203,18 @@ public class FsStoreVerifyCodeScrmServiceImpl extends ServiceImpl<FsStoreVerifyC
             return R.ok("导入成功!无待导入数据");
         }
 
+        //加锁查询商品
+        FsStoreProductScrm product = fsStoreProductScrmMapper.selectLockById(productId);
+        if (product == null) {
+            throw new ServiceException("操作失败,商品不存在");
+        }
+
         List<String> verifyCodes = verifyCodeDTOS.stream()
                 .map(FsStoreVerifyCodeDTO::getVerifyCode)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toList());
 
+
         StringBuilder errorMsg = new StringBuilder();
         long emptyCodeCount = verifyCodeDTOS.stream()
                 .filter(dto -> dto.getVerifyCode() == null || dto.getVerifyCode().trim().isEmpty())

+ 4 - 1
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreAfterSalesVO.java

@@ -119,5 +119,8 @@ public class FsStoreAfterSalesVO implements Serializable
     private String serialNo;
 
     //溯源码
-    private String verifyCodes;
+    private String verifyCode;
+
+    //产品批次号
+    private String batchNumber;
 }

+ 4 - 2
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderVO.java

@@ -274,6 +274,8 @@ public class FsStoreOrderVO implements Serializable
      * **/
     private String serialNo;
 
-    //溯源码
-    private String verifyCodes;
+    /**
+     * 批次号
+     * **/
+    private String batchNumber;
 }

+ 30 - 5
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -88,11 +88,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="scheduleId"    column="schedule_id"    />
         <result property="orderVisit"    column="order_visit"    />
         <result property="serviceFee"    column="service_fee"    />
+        <result property="serviceFee"    column="service_fee"    />
+        <result property="batchNumber"    column="batch_number"    />
         <!--<result property="orderMedium"    column="order_medium"    />-->
     </resultMap>
 
     <sql id="selectFsStoreOrderVo">
-        select id, order_code,service_fee, extend_order_id,pay_order_id,bank_order_id, user_id,order_visit, real_name, user_phone, user_address, cart_id, freight_price, total_num, total_price, total_postage, pay_price, pay_postage,pay_delivery,pay_money, deduction_price, coupon_id, coupon_price, paid, pay_time, pay_type, create_time, update_time, status, refund_status, refund_reason_wap_img, refund_reason_wap_explain, refund_reason_time, refund_reason_wap, refund_reason, refund_price, delivery_sn, delivery_name, delivery_type, delivery_id, gain_integral, use_integral, pay_integral, back_integral, mark, is_del, remark, cost, verify_code, store_id, shipping_type, is_channel, is_remind, is_sys_del,is_prescribe,prescribe_id ,company_id,company_user_id,is_package,package_json,item_json,order_type,package_id,finish_time,delivery_status,delivery_pay_status,delivery_time,delivery_pay_time,delivery_pay_money,tui_money,tui_money_status,delivery_import_time,tui_user_id,tui_user_money_status,order_create_type,store_house_code,dept_id,is_edit_money,customer_id,is_pay_remain,delivery_send_time,certificates,schedule_id,combination_order_id from fs_store_order_scrm
+        select id, order_code,service_fee, extend_order_id,pay_order_id,bank_order_id, user_id,order_visit, real_name, user_phone, user_address, cart_id, freight_price, total_num, total_price, total_postage, pay_price, pay_postage,pay_delivery,pay_money, deduction_price, coupon_id, coupon_price, paid, pay_time, pay_type, create_time, update_time, status, refund_status, refund_reason_wap_img, refund_reason_wap_explain, refund_reason_time, refund_reason_wap, refund_reason, refund_price, delivery_sn, delivery_name, delivery_type, delivery_id, gain_integral, use_integral, pay_integral, back_integral, mark, is_del, remark, cost, verify_code, store_id, shipping_type, is_channel, is_remind, is_sys_del,is_prescribe,prescribe_id ,company_id,company_user_id,is_package,package_json,item_json,order_type,package_id,finish_time,delivery_status,delivery_pay_status,delivery_time,delivery_pay_time,delivery_pay_money,tui_money,tui_money_status,delivery_import_time,tui_user_id,tui_user_money_status,order_create_type,store_house_code,dept_id,is_edit_money,customer_id,is_pay_remain,delivery_send_time,certificates,schedule_id,combination_order_id,batch_number from fs_store_order_scrm
     </sql>
 
     <select id="selectFsStoreOrderList" parameterType="FsStoreOrderScrm" resultMap="FsStoreOrderResult">
@@ -429,6 +431,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followDoctorId != null">follow_doctor_id = #{followDoctorId},</if>
             <if test="cycle != null">cycle = #{cycle},</if>
             <if test="combinationOrderId != null">combination_order_id = #{combinationOrderId},</if>
+            <if test="batchNumber != null">batch_number = #{batchNumber},</if>
         </trim>
         where id = #{id}
     </update>
@@ -1579,13 +1582,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select DISTINCT o.*,u.phone,u.register_code,u.register_date,u.source, c.company_name ,cu.nick_name as company_user_nick_name ,cu.phonenumber as company_usere_phonenumber
         , csc.name miniProgramName,ssc.store_name,
         ssc.store_seq,
-        ssc.merchant_id,hps.serial_no,vc.verify_code AS verifyCodes
+        ssc.merchant_id,hps.serial_no
         from fs_store_order_scrm o
         left join fs_store_hospital580_prescription_scrm hps on hps.store_order_id = o.id
         left join fs_user u on o.user_id=u.user_id
         left join company c on c.company_id=o.company_id
         left join company_user cu on cu.user_id=o.company_user_id
-        LEFT JOIN fs_store_verify_code_scrm vc ON o.id = vc.order_id
         <if test="maps.erpAccount != null and maps.erpAccount != ''">
             LEFT JOIN fs_store_order_df df on df.order_id=o.id
         </if>
@@ -1686,8 +1688,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.productName != null and  maps.productName !=  '' ">
                 and fsp.product_name like concat('%', #{maps.productName}, '%')
             </if>
-            <if test="maps.verifyCodes != null and  maps.verifyCodes !=  '' ">
-                and vc.verify_code like concat('%', #{maps.verifyCodes}, '%')
+            <if test="maps.verifyCode != null and  maps.verifyCode !=  '' ">
+                and o.verify_code like concat('%', #{maps.verifyCode}, '%')
+            </if>
+            <if test="maps.batchNumber != null and  maps.batchNumber !=  '' ">
+                and o.batch_number like concat('%', #{maps.batchNumber}, '%')
             </if>
             <if test="maps.orderType != null    ">
                 and o.order_type =#{maps.orderType}
@@ -2156,4 +2161,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         END
         MINUTE)
     </select>
+
+    <update id="batchUpdateVerifyCodeByOrderCode" parameterType="java.util.List">
+        <if test="list != null and list.size() > 0">
+            UPDATE fs_store_order_scrm
+            SET verify_code = CASE order_code
+            <foreach collection="list" item="item" index="index">
+                WHEN #{item.orderNumber} THEN #{item.verifyCode}
+            </foreach>
+            END,
+            batch_number = CASE order_code
+            <foreach collection="list" item="item" index="index">
+                WHEN #{item.orderNumber} THEN #{item.batchNumber}
+            </foreach>
+            END
+            WHERE order_code IN
+            <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
+                #{item.orderNumber}
+            </foreach>
+        </if>
+    </update>
 </mapper>

+ 1 - 12
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -812,18 +812,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <sql id="baseSql">
        DISTINCT p.product_id, p.image,p.video, p.slider_image, p.product_name, p.product_info, p.keyword, p.bar_code,
-       p.cate_id, p.price, p.vip_price, p.ot_price, p.postage, p.unit_name, p.sort, CASE
-	WHEN p.cate_id = '202' OR p.cate_id = '232' OR p.cate_id = '201' OR P.cate_id = '233' THEN
-		p.stock
-	ELSE
-		( SELECT COUNT(*) FROM fs_store_verify_code_scrm vc WHERE vc.product_id = p.product_id AND vc.outbound_status = 0 AND is_del = 0)
-       END AS stock,
- CASE
-	WHEN p.cate_id = '202' OR p.cate_id = '232' OR p.cate_id = '201' OR P.cate_id = '233' THEN
-		p.sales
-	ELSE
-		( SELECT COUNT(*) FROM fs_store_verify_code_scrm vc WHERE vc.product_id = p.product_id AND vc.outbound_status = 1 AND is_del = 0)
-       END AS sales,
+       p.cate_id, p.price, p.vip_price, p.ot_price, p.postage, p.unit_name, p.sort, p.stock,p.sales,
        p.is_hot, p.is_benefit, p.is_best, p.is_new, p.description, p.create_time, p.update_time, p.is_postage,
        p.is_del, p.give_integral, p.cost, p.is_good, p.browse, p.code_path, p.temp_id, p.spec_type, p.is_integral,
        p.integral, p.product_type, p.prescribe_code, p.prescribe_spec, p.prescribe_factory, p.prescribe_name,

+ 9 - 0
fs-user-app/src/main/java/com/fs/app/controller/PatientController.java

@@ -9,6 +9,8 @@ import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.txocr.IdCardVerificationResponse;
+import com.fs.common.utils.txocr.TxOcrClient;
 import com.fs.his.config.StoreConfig;
 import com.fs.his.domain.FsPatient;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
@@ -19,6 +21,7 @@ import com.fs.his.utils.IdCardUtil;
 import com.fs.system.service.ISysConfigService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -112,10 +115,16 @@ public class PatientController extends  AppBaseController {
             }
         }
 
+
         if (param.getPatientName().length()<2||param.getPatientName().length()>30||!param.getPatientName().matches("^[\u4e00-\u9fa5]+$")) {
             return   R.error("就诊人名称不合法");
         }
 
+        IdCardVerificationResponse idCardVerificationResponse = TxOcrClient.IdCardVerification(param.getPatientName(), idCardNumber);
+        if(0 != idCardVerificationResponse.getResult()){
+            throw new CustomException(idCardVerificationResponse.getDescription());
+        }
+
         try {
             if (idCardNumber != null) {
                 String birthDateString = idCardNumber.substring(6, 14);

+ 11 - 13
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -2,7 +2,6 @@ package com.fs.app.controller.store;
 
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.BeanCopyUtils;
@@ -12,7 +11,6 @@ import com.fs.common.utils.StringUtils;
 import com.fs.erp.service.IErpGoodsService;
 import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.hisStore.domain.*;
-import com.fs.hisStore.mapper.FsStoreVerifyCodeScrmMapper;
 import com.fs.hisStore.param.*;
 import com.fs.hisStore.service.*;
 import com.fs.hisStore.vo.*;
@@ -22,7 +20,6 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,8 +63,8 @@ public class ProductScrmController extends AppBaseController {
     @Autowired
     private ISysConfigService configService;
 
-    @Autowired
-    private FsStoreVerifyCodeScrmMapper verifyCodeScrmMapper;
+//    @Autowired
+//    private FsStoreVerifyCodeScrmMapper verifyCodeScrmMapper;
 
     /**
      * 获取用户信息
@@ -153,13 +150,14 @@ public class ProductScrmController extends AppBaseController {
         List<FsStoreProductAttrScrm> productAttr=attrService.selectFsStoreProductAttrByProductId(product.getProductId());
         List<FsStoreProductAttrValueScrm> productValues=attrValueService.selectFsStoreProductAttrValueByProductId(product.getProductId());
 
-        //根据商品类型区分显示库存
-        int number;
-        if(product.getCateId().equals(202L) || product.getCateId().equals(232L) || product.getCateId().equals(201L) || product.getCateId().equals(233L)){
-        number = product.getStock().intValue();
-        }else {
-           number = verifyCodeScrmMapper.selectCount(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getProductId,product.getProductId()).eq(FsStoreVerifyCodeScrm::getOutboundStatus,0L).eq(FsStoreVerifyCodeScrm::getIsDel,0L));
-        }
+//        //根据商品类型区分显示库存
+//        int number;
+//        number = product.getStock().intValue();
+//        if(product.getCateId().equals(202L) || product.getCateId().equals(232L) || product.getCateId().equals(201L) || product.getCateId().equals(233L)){
+//        number = product.getStock().intValue();
+//        }else {
+//           number = verifyCodeScrmMapper.selectCount(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getProductId,product.getProductId()).eq(FsStoreVerifyCodeScrm::getOutboundStatus,0L).eq(FsStoreVerifyCodeScrm::getIsDel,0L));
+//        }
 
 
 //        for(FsStoreProductAttrValue value:productValues){
@@ -255,7 +253,7 @@ public class ProductScrmController extends AppBaseController {
                 productRelationService.insertFsStoreProductRelation(relation);
             }
         }
-        return R.ok().put("product",product).put("productAttr",productAttr).put("productValues",productValues).put("store",fsStoreScrm).put("num",number);
+        return R.ok().put("product",product).put("productAttr",productAttr).put("productValues",productValues).put("store",fsStoreScrm);
     }
 
     @Login

+ 5 - 5
fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

@@ -264,11 +264,11 @@ public class StoreOrderScrmController extends AppBaseController {
             }
         }
 
-        //获取订单下的溯源码
-        List<FsStoreVerifyCodeScrm> verifyCodes = verifyCodeScrmMapper.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().select(FsStoreVerifyCodeScrm::getVerifyCode).eq(FsStoreVerifyCodeScrm::getOrderId, orderId).eq(FsStoreVerifyCodeScrm::getOutboundStatus,1L).eq(FsStoreVerifyCodeScrm::getIsDel,0L));
-        if(!verifyCodes.isEmpty()){
-            order.setVerifyCodes(verifyCodes.stream().map(FsStoreVerifyCodeScrm::getVerifyCode).collect(Collectors.joining()));
-        }
+//        //获取订单下的溯源码
+//        List<FsStoreVerifyCodeScrm> verifyCodes = verifyCodeScrmMapper.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().select(FsStoreVerifyCodeScrm::getVerifyCode).eq(FsStoreVerifyCodeScrm::getOrderId, orderId).eq(FsStoreVerifyCodeScrm::getOutboundStatus,1L).eq(FsStoreVerifyCodeScrm::getIsDel,0L));
+//        if(!verifyCodes.isEmpty()){
+//            order.setVerifyCodes(verifyCodes.stream().map(FsStoreVerifyCodeScrm::getVerifyCode).collect(Collectors.joining()));
+//        }
         return R.ok().put("isAfterSales",isAfterSales).put("order",order).put("items",list).put("payLimitTime",payLimitTime).put("prescribe",prescribe).put("prescriptionAuditStatus",prescriptionAuditStatus)
                 .put("storeName",storeName);
     }