Kaynağa Gözat

合并代码

yfh 1 hafta önce
ebeveyn
işleme
c93284c563

+ 0 - 4
fs-admin/src/main/java/com/fs/company/controller/CompanyController.java

@@ -164,10 +164,6 @@ public class CompanyController extends BaseController
     @PutMapping("/bindShopCompany")
     public AjaxResult bindShopCompany(@RequestBody Company company)
     {
-        Company companyByStoreId = companyService.selectCompanyByStoreId(company.getStoreId());
-        if (ObjectUtil.isNotEmpty(companyByStoreId)&&!companyByStoreId.getStoreId().equals(company.getStoreId())){
-            throw new RuntimeException("此店铺已经绑定了【"+companyByStoreId.getCompanyName()+"】 公司");
-        }
         return toAjax(companyService.updateCompany(company));
     }
 

+ 50 - 11
fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -3,11 +3,15 @@ package com.fs.app.controller;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.domain.R;
 import com.fs.common.enums.BusinessType;
+import com.fs.common.enums.ImTypeEnum;
+import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
 import com.fs.core.config.WxPayProperties;
@@ -17,19 +21,27 @@ import com.fs.his.dto.FsInquiryOrderPatientDTO;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.vo.*;
+import com.fs.im.config.ImTypeConfig;
 import com.fs.im.dto.MsgCustomDTO;
 import com.fs.im.dto.MsgDTO;
 import com.fs.im.dto.MsgDataDTO;
 import com.fs.im.dto.MsgDataFormatDTO;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import io.reactivex.internal.operators.parallel.ParallelRunOn;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -71,7 +83,8 @@ public class InquiryOrderController extends  AppBaseController {
     private IFsInquiryOrderReportService orderReportService;
     @Autowired
     private IImService imService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @Login
     @GetMapping("/getInquiryOrderList")
     public R getInquiryOrderList(FsInquiryOrderListPDParam param)
@@ -79,11 +92,7 @@ public class InquiryOrderController extends  AppBaseController {
         FsDoctor doctor=doctorService.selectFsDoctorByDoctorId(Long.parseLong(getDoctorId()));
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
 
-        if (Objects.nonNull(param.getUserId())) {
-            param.setDoctorId(null);
-        } else if (Objects.nonNull(param.getDoctorId())) {
-            param.setDoctorId(Long.parseLong(getDoctorId()));
-        }
+        param.setDoctorId(Long.parseLong(getDoctorId()));
 
         param.setIsAccept(doctor.getIsAccept());
         param.setIsSelf(doctor.getIsSelf());
@@ -164,7 +173,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("抢单")
     @PostMapping("/acceptOrder")
-    public R acceptOrder(@Validated @RequestBody FsInquiryOrderAcceptParam param, HttpServletRequest request){
+    public R acceptOrder(@Validated @RequestBody FsInquiryOrderAcceptParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.acceptOrder(param);
     }
@@ -172,7 +181,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("接单")
     @PostMapping("/receiveOrder")
-    public R receiveOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request){
+    public R receiveOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.receiveOrder(param);
     }
@@ -188,7 +197,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("完成订单")
     @PostMapping("/finishOrder")
-    public R finishOrder(@Validated @RequestBody FsInquiryOrderFinishParam param, HttpServletRequest request){
+    public R finishOrder(@Validated @RequestBody FsInquiryOrderFinishParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.finishOrder(param);
     }
@@ -241,7 +250,7 @@ public class InquiryOrderController extends  AppBaseController {
     @ApiOperation("提交诊断报告")
     @PostMapping("/submitInquiryOrderReport")
     @Transactional
-    public R submitInquiryOrderReport(@Validated @RequestBody FsInquiryOrderReportSubmitDParam param, HttpServletRequest request){
+    public R submitInquiryOrderReport(@Validated @RequestBody FsInquiryOrderReportSubmitDParam param, HttpServletRequest request) throws JsonProcessingException {
         FsInquiryOrderReport report=null;
         if(param.getReportId()!=null&&param.getReportId()>0){
             report=orderReportService.selectFsInquiryOrderReportByReportId(param.getReportId());
@@ -299,7 +308,30 @@ public class InquiryOrderController extends  AppBaseController {
         msg.setMsgType("TIMCustomElem");//TIMCustomElem
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        if (ImTypeConfig.IMTYPE== ImTypeEnum.OPENIM){
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("D"+report.getDoctorId(),"U"+report.getUserId(),110,"report","","","",report.getOrderId().toString(),ex);
+        }else if (ImTypeConfig.IMTYPE== ImTypeEnum.TENCENT){
+            imService.sendMsg(msgDTO);
+        }
+//        JSONObject jsonObject = new JSONObject();
+//        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+//        openImMsgDTO.setSendID("D"+report.getDoctorId().toString());
+//        openImMsgDTO.setRecvID("U"+report.getUserId().toString());
+//        openImMsgDTO.setContentType(110);
+//        openImMsgDTO.setSenderPlatformID(5);
+//        openImMsgDTO.setSessionType(1);
+//
+//        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+//        PayloadDTO payloadDTO = new PayloadDTO();
+//        payloadDTO.setData("startInquiry");
+//        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+//        extension.setTitle();
+//        //content.setContent(ext);
+//        openImMsgDTO.setContent(content);
+//        openImMsgDTO.setEx(customDTO);
+//        openIMService.openIMSendMsg(openImMsgDTO);
         return R.ok("操作成功");
     }
 
@@ -330,4 +362,11 @@ public class InquiryOrderController extends  AppBaseController {
         }
         return R.ok().put("data","");
     }
+
+    @PostMapping("/closeOrder")
+    public R closeOrder(@RequestBody Long orderId){
+        inquiryOrderService.closeOrder(orderId);
+        logger.info("closeOrder: {}", orderId);
+        return R.ok();
+    }
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java

@@ -1162,6 +1162,9 @@ public interface FsStoreOrderMapper
     @Select("select * from fs_store_order where  `status`=2 and extend_order_id is not null and extend_order_id != '' ")
     List<FsStoreOrder> selectWdtOmsOrderdeliveryOp();
 
+    @Select("select * from fs_store_order_scrm where  `status`=1 and extend_order_id is not null and extend_order_id != '' ")
+    List<FsStoreOrderScrm> selectWdtOmsOrderdeliveryOpScrm();
+
     int batchUpdateErpByOrderIds(@Param("maps") List<Map<String, String>> maps);
 
     @Select(" select * from fs_store_order where order_code=#{orderCode} and store_id=#{storeId}")

+ 15 - 4
fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java

@@ -15,12 +15,10 @@ import com.fs.erp.dto.df.BspOrderResponse;
 import com.fs.erp.dto.df.DFConfigVo;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.domain.*;
-import com.fs.his.dto.ExpressInfoDTO;
-import com.fs.his.dto.ExpressNotifyDTO;
-import com.fs.his.dto.ExpressResultDTO;
-import com.fs.his.dto.StoreOrderExpressExportDTO;
+import com.fs.his.dto.*;
 import com.fs.his.param.*;
 import com.fs.his.vo.*;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -267,4 +265,17 @@ public interface IFsStoreOrderService
     String selectFsStoreOrderProductStatistics(FsStoreOrderParam fsStoreOrder);
 
     int afterSalesByProduct(FsStoreOrderSalesParam fsStoreOrder);
+
+    /**
+     * 查询互联网医院订单金额统计信息
+     * */
+    FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto);
+
+    void deliveryOrderScrm(String orderCode, String mailNo, String expressCode, String expressName);
+
+    FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String soId);
+
+    FsStoreOrder confirmOrder(FsPackageOrder packageOrder,Long doctorId);
+
+    List<FsStoreOrder> selectOutTimeOrderList(Integer unPayTime);
 }

+ 506 - 2
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -279,7 +279,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     private FsStoreOrderDfMapper fsStoreOrderDfMapper;
     @Autowired
     private FsUserWxMapper fsUserWxMapper;
-
+    @Autowired
+    private FsUserMapper fsUserMapper;
     @Autowired
     private IFsUserWxService userWxService;
 
@@ -289,6 +290,19 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     @Autowired
     private com.fs.gtPush.service.uniPush2Service uniPush2Service;
 
+    //ERP 类型到服务的映射
+    private Map<Integer, IErpOrderService> erpServiceMap;
+    @PostConstruct
+    public void initErpServiceMap() {
+        erpServiceMap = new HashMap<>();
+        erpServiceMap.put(1, gyOrderService);      // 管易
+        erpServiceMap.put(2, wdtOrderService);     // 旺店通
+        erpServiceMap.put(3, hzOMSOrderService);   // 瀚智OMS
+        erpServiceMap.put(4, dfOrderService);      // 代服
+        erpServiceMap.put(5, jSTOrderService);     // 聚水潭
+        erpServiceMap.put(6, k9OrderService);      // K9
+    }
+
     /**
      * 查询订单
      *
@@ -332,8 +346,151 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     @Override
     public int updateFsStoreOrder(FsStoreOrder fsStoreOrder) {
         fsStoreOrder.setUpdateTime(DateUtils.getNowDate());
+        //推送修改的互联网医院订单地址到聚水潭ERP
+        try {
+            pushOrderAddressToErp(fsStoreOrder);
+        }catch (Exception e){
+            log.error("修改互联网医院订单地址推送到聚水潭ERP失败,orderId: {}", fsStoreOrder.getOrderId(), e);
+        }
         return fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
     }
+    /**
+     * 推送修改订单的最新地址到 ERP
+     *
+     * @param partialOrder 前端传入的部分订单对象,必须包含 id、userAddress
+     */
+    public void pushOrderAddressToErp(FsStoreOrder partialOrder){
+        if (partialOrder == null || partialOrder.getOrderId() == null) {
+            log.info("传入订单为空或ID缺失,跳过ERP同步");
+            return;
+        }
+
+        // 1. 检查 ERP 是否开启
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        if (erpOpen == null || erpOpen == 0) {
+            log.info("ERP未开启,跳过同步");
+            return;
+        }
+        Integer erpType = sysConfig.getErpType();
+        if (erpType == null || !erpServiceMap.containsKey(erpType)) {
+            log.info("ERP类型配置无效: {}", erpType);
+            return;
+        }
+        //目前只针对聚水潭ERP推送最新的修改地址
+        if (erpType != 5){
+            return;
+        }
+        // 2. 从数据库获取完整订单(用于补全必要字段;当前是修改商城订单接口,查询fs_store_order_scrm表)
+        FsStoreOrder dbOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderId(partialOrder.getOrderId());
+        if (dbOrder == null) {
+            log.error("数据库表fs_store_order中订单不存在,orderId: {}", partialOrder.getOrderId());
+            return;
+        }
+        //判断当前是否满足推送条件(erp订单号不为空且订单状态为待发货时可推送)
+        if (StringUtils.isBlank(dbOrder.getExtendOrderId()) || dbOrder.getStatus() != 1) {
+            log.info("修改订单地址不满足推送到ERP条件: extendOrderId={}, status={}", dbOrder.getExtendOrderId(), dbOrder.getStatus());
+            return;
+        }
+        // 3. 构造用于ERP推送的订单对象:订单地址用传入的新值
+        if (StrUtil.isBlank(partialOrder.getUserAddress())){
+            log.error("修改互联网医院订单地址为空,orderId: {}", partialOrder.getOrderId());
+            return;
+        }
+        dbOrder.setUserAddress(partialOrder.getUserAddress());
+        // 4. 构建 ERP 订单对象
+        try {
+        ErpOrder erpOrder = buildErpOrder(dbOrder,sysConfig);
+
+        // 5. 调用对应 ERP 服务(当前是聚水潭ERP)
+        IErpOrderService erpService = erpServiceMap.get(erpType);
+
+        //执行互联网医院订单推送逻辑
+        ErpOrderResponse response = erpService.addOrder(erpOrder);
+        log.info("ERP地址推送结果 - 互联网医院订单: {}, ERP类型: {}, 成功: {}, 外部单号: {}",
+                dbOrder.getOrderCode(), erpType, response.getSuccess(), response.getCode());
+        } catch (Exception e) {
+            log.error("推送修改互联网医院订单地址到ERP失败,orderId: {}", partialOrder.getOrderId(), e);
+        }
+    }
+
+    /**
+     * 构建 ErpOrder 对象(仅用于修改互联网医院订单地址推送到聚水潭ERP)
+     */
+    private ErpOrder buildErpOrder(FsStoreOrder order, FsSysConfig sysConfig) {
+        ErpOrder erpOrder = new ErpOrder();
+
+        //订单号
+        erpOrder.setPlatform_code(order.getOrderCode());
+
+        // 店铺编码
+        erpOrder.setShop_code(sysConfig.getErpJstShopCode());
+        erpOrder.setBuyer_account(order.getUserName());
+        //成交时间
+        erpOrder.setDeal_datetime(order.getBeginTime());
+        //支付信息
+        List<ErpOrderPayment> payments = new ArrayList<>();
+        ErpOrderPayment payment = new ErpOrderPayment();
+        payment.setPay_type_code("weixin");
+        erpOrder.setPayments(payments);
+        //卖家留言
+        erpOrder.setBuyer_memo("");
+        //推送聚水潭erp不需要推送处方图片,这里就注释代码
+        //String s = fsPrescribeService.PrescribeImg(order.getPrescribeId());
+        //erpOrder.setSeller_memo(erpOrder.getSeller_memo() + "||" + s + "||");
+        // 收货人姓名(过滤非法字符)
+        erpOrder.setReceiver_name(order.getUserName().replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9]", ""));
+        // 电话处理
+        String phone = null;
+        if (StrUtil.isNotBlank(order.getErpPhone())) {
+            phone = order.getErpPhone();
+        } else if (StrUtil.isNotBlank(order.getUserPhone())) {
+            // 如果手机号被加密(长度>11),需解密
+            phone = order.getUserPhone().length() > 11 ? decryptPhone(order.getUserPhone()) : order.getUserPhone();
+        }
+
+        if (StrUtil.isNotBlank(phone)) {
+            if (phone.length() > 11) {
+                erpOrder.setReceiver_phone(phone);     // 固话
+            } else {
+                erpOrder.setReceiver_mobile(phone);    // 手机
+            }
+        }
+
+        // 地址解析
+        String userAddress = order.getUserAddress();
+        try {
+            String[] parts = userAddress.split(" ");
+            if (parts.length < 3) {
+                // 调用地址解析服务(如快递鸟)
+                String kdnResult = fsUserAddressService.getKdnAddress(userAddress);
+                Map<String, Object> result = JSON.parseObject(kdnResult);
+                Map<String, String> addr = (Map<String, String>) ((Map) result.get("Data")).get("result");
+                erpOrder.setReceiver_province(addr.get("ProvinceName"));
+                erpOrder.setReceiver_city(addr.get("CityName"));
+                erpOrder.setReceiver_district(addr.get("ExpAreaName"));
+                erpOrder.setReceiver_address(addr.get("StreetName") + addr.get("Address"));
+            } else {
+                erpOrder.setReceiver_province(parts[0]);
+                erpOrder.setReceiver_city(parts[1]);
+                erpOrder.setReceiver_district(parts[2]);
+                erpOrder.setReceiver_address(parts.length > 3 ? String.join("", Arrays.copyOfRange(parts, 3, parts.length)) : parts[2]);
+            }
+
+            // 清理地址中的特殊字符
+            if (erpOrder.getReceiver_address() != null) {
+                erpOrder.setReceiver_address(
+                        erpOrder.getReceiver_address()
+                                .replace("+", "加")
+                                .replace("\n", "")
+                                .replace("\r", "")
+                );
+            }
+        } catch (Exception e) {
+            log.error("修改订单地址解析异常,订单: {}", order.getOrderCode(), e);
+        }
+        return erpOrder;
+    }
 
     /**
      * 修改订单状态-收货信息
@@ -963,6 +1120,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         StringBuilder failureMsg = new StringBuilder();
         for (FsStoreProductDeliverExcelVO vo : list) {
             try {
+                log.info("原始数据:{}",JSON.toJSONString(vo));
                 FsStoreOrder o = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(vo.getOrderCode());
                 if (storeId != null) {
                     if (o.getStoreId() != storeId) {
@@ -1005,6 +1163,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                 }
                 FsStore store = fsStoreMapper.selectFsStoreByStoreId(o.getStoreId());
                 int i = fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
+                log.info("手动发货导入订单号:订单号为"+fsStoreOrder.getOrderCode() + "快递单号为:" + fsStoreOrder.getDeliverySn());
                 String lastFourNumber = "";
                 if (fsStoreOrder.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
                     if (store.getSendPhone() != null) {
@@ -1492,6 +1651,21 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
             }
             storeOrder.setPayTime(new Date());
             fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+            try {
+                //更新用户下单次数(获取阈值,当订单总价大于等于阈值,则下单次数+1)
+                BigDecimal minThreshold = toBigDecimal(config.get("minimumThreshold"), BigDecimal.ZERO);
+                if (order.getTotalPrice().compareTo(minThreshold) >= 0) {
+                    //根据用户id获取fs_user表对应的下单次数并更新
+                    FsUser user = fsUserMapper.selectFsUserById(order.getUserId());
+                    //处理 orderCount 为 null 的情况:null 视为 0
+                    long currentCount = user.getOrderCount() != null ? user.getOrderCount() : 0;
+                    user.setOrderCount(currentCount + 1);
+                    fsUserMapper.updateFsUser(user);
+                }
+            } catch (Exception ex) {
+                // 仅记录日志,这个更新逻辑如果异常不回滚其他逻辑代码
+                log.error("更新用户下单次数失败,订单: {}, 用户: {}", order.getOrderCode(), order.getUserId(), ex);
+            }
             //更新优惠券状态
             if (order.getUserCouponId() != null && order.getUserCouponId() > 0) {
                 FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(order.getUserCouponId());
@@ -1517,7 +1691,27 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
             return R.error();
         }
     }
-
+    public  BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
+        if (value == null) {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        }
+        if (value instanceof String) {
+            String str = ((String) value).trim();
+            return str.isEmpty() ? defaultValue : new BigDecimal(str);
+        }
+        if (value instanceof Number) {
+            return new BigDecimal(((Number) value).toString());
+        }
+        // 兜底:toString 转换
+        try {
+            return new BigDecimal(value.toString().trim());
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
     @Override
     public Long selectFsStoreOrderTotalCount(int type, Long companyId) {
         return fsStoreOrderMapper.selectFsStoreOrderTotalCount(type, companyId);
@@ -3708,6 +3902,18 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                     failureMsg.append(msg).append("该状态不支持修改为待推送");
                     continue;
                 }
+                if ("-1".equals(vo.getStatus())) {
+                    failureNum++;
+                    String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
+                    failureMsg.append(msg).append("该状态不支持修改为退款中,需要手动申请退款");
+                    continue;
+                }
+                if ("-2".equals(vo.getStatus())) {
+                    failureNum++;
+                    String msg = "<br/>" + failureNum + "、订单编号 " + vo.getOrderCode() + " 导入失败:";
+                    failureMsg.append(msg).append("该状态不支持修改为退款中,需要审核完成退款");
+                    continue;
+                }
 
                 Integer status = o.getStatus();
 
@@ -3908,4 +4114,302 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         return 1;
     }
 
+    @Override
+    public FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto) {
+        return fsStoreOrderMapper.selectFsStoreOrderAmountStats(queryDto);
+    }
+    @Autowired
+    FsStoreOrderScrmMapper storeOrderScrmMapper;
+
+
+    @Autowired
+    IFsStoreOrderLogsScrmService iFsStoreOrderLogsScrmService;
+    @Override
+    public void deliveryOrderScrm(String orderCode, String deliveryId, String deliverCode, String deliverName) {
+        FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderScrmByOrderCode(orderCode);
+        if (order != null && order.getStatus() == 1) {
+            FsExpress express = expressService.selectFsExpressByOmsCode(deliverCode);
+            if (express != null) {
+                order.setDeliveryName(deliverName);
+                order.setDeliveryCode(express.getCode());
+            }
+            order.setStatus(2);
+            order.setDeliverySn(deliveryId);
+            order.setDeliverySendTime(DateUtils.getNowDate());
+            storeOrderScrmMapper.updateFsStoreOrder(order);
+            iFsStoreOrderLogsScrmService.create(order.getId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
+            if (order.getCompanyId() != null && order.getCompanyId() > 0) {
+                companyService.subtractCompanyMoneyScrm(order);
+            }
+
+            FsStore store = fsStoreMapper.selectFsStoreByStoreId(order.getStoreId());
+            //订阅物流回调
+            String lastFourNumber = "";
+            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+                if (store != null && store.getSendPhone() != null) {
+                    lastFourNumber = store.getSendPhone();
+                } else {
+                    lastFourNumber = order.getUserPhone();
+                }
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressService.subscribeEspress(order.getOrderCode(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
+
+
+        }
+
+    }
+
+    @Override
+    public FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String soId) {
+        return fsStoreOrderMapper.selectFsStoreOrderScrmByOrderCode(soId);
+    }
+    @Override
+    public FsStoreOrder confirmOrder(FsPackageOrder packageOrder, Long doctorId) {
+
+        FsPackage fsPackage = fsPackageMapper.selectFsPackageByPackageId(packageOrder.getPackageId());
+        JSONArray objects = JSONUtil.parseArray(fsPackage.getProductJson());
+        List<FsPackagePruductDTO> products = JSONUtil.toList(objects, FsPackagePruductDTO.class);
+        Map<String, Object> packageJson = (Map) JSON.parse(packageOrder.getPackageJson());
+        Integer packageSubType = (Integer) packageJson.get("packageSubType");
+        Integer productType = (Integer) packageJson.get("productType");
+        FsStoreOrder order = new FsStoreOrder();
+        Long prescribeId =null;
+        if (productType==1 || packageSubType==2){
+            if (packageOrder.getDoctorId() == null) {
+                Long doctorID = iFsDoctorService.selectFsDoctorDoctorByPackage();
+                packageOrder.setDoctorId(doctorID);
+            }
+            if (packageSubType == 3 ) {
+                inquiryOrderService.createOrderByPackageOrderStatus4(packageOrder);
+            }
+            prescribeId = fsPrescribeService.insertFsPrescribeByPackageOrder(packageOrder);
+            order.setPrescribeId(prescribeId);
+        }
+
+
+        List<FsStoreOrderItem> items = new ArrayList<>();
+        log.info("套餐包生成药品订单:{}", packageOrder.getOrderSn());
+        order.setOrderCode(packageOrder.getOrderSn());
+        order.setUserId(packageOrder.getUserId());
+        order.setStoreId(fsPackage.getStoreId());
+
+        order.setStatus(1);
+        order.setPayDelivery(packageOrder.getPayDelivery());
+        order.setPayRemain(packageOrder.getPayRemain());
+        order.setPayType(packageOrder.getPayType());
+        order.setPackageSecondName(packageOrder.getPackageSecondName());
+        order.setDoctorId(packageOrder.getDoctorId());
+
+        order.setPackageId(packageOrder.getPackageId());
+        order.setPackageName(packageOrder.getPackageName());
+        order.setPrescribePrice(packageOrder.getTotalPrice());
+        order.setDiscountMoney(packageOrder.getDiscountMoney());
+        order.setDeptId(packageOrder.getDeptId());
+        order.setCompanyId(packageOrder.getCompanyId());
+        order.setCompanyUserId(packageOrder.getCompanyUserId());
+        order.setPackageOrderId(packageOrder.getOrderId());
+        order.setCreateTime(new Date());
+        if (packageOrder.getSource() != null) {
+            order.setSource(packageOrder.getSource());
+        }
+        String addressJson = packageOrder.getAddressJson();
+        if (addressJson != null && addressJson != "") {
+            Map<String, String> parse = (Map) JSON.parse(addressJson);
+            order.setUserName(parse.get("userName"));
+            order.setUserPhone(parse.get("userPhone"));
+            order.setUserAddress(parse.get("userAddress"));
+        }
+
+
+        Long totalNum = 0L;
+        BigDecimal totalPrice = new BigDecimal(0);
+        boolean noTui = false;
+        for (FsPackagePruductDTO product : products) {
+            if (product.getBarCode().equals("106013")) {
+                noTui = true;
+            }
+            totalPrice = totalPrice.add(product.getPrice().multiply(BigDecimal.valueOf(product.getCount())));
+            totalNum = totalNum + product.getCount();
+            FsStoreOrderItem item = new FsStoreOrderItem();
+            item.setProductId(product.getProductId());
+            item.setStoreId(fsPackage.getStoreId());
+            item.setProductAttrValueId(product.getId());
+            item.setNum(Long.parseLong(product.getCount().toString()));
+            item.setIsDrug(product.getIsDrug());
+            FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
+            dto.setImage(product.getImage());
+            dto.setNum(Long.parseLong(product.getCount().toString()));
+            dto.setProductName(product.getProductName());
+            dto.setProductId(product.getProductId());
+            dto.setSku(product.getSku());
+            dto.setBarCode(product.getBarCode());
+            dto.setPrice(product.getPrice());
+            dto.setNum(Long.parseLong(product.getCount().toString()));
+            dto.setImage(product.getImage());
+            item.setIsPrescribe(0);
+            item.setJsonInfo(JSON.toJSONString(dto));
+            item.setIsGift(0);
+            items.add(item);
+        }
+        String json = configService.selectConfigByKey("his.package");
+        PackageConfigDTO configDTO = JSONUtil.toBean(json, PackageConfigDTO.class);
+        FsPackageOrder fsPackageOrder = new FsPackageOrder();
+        //赠品处理
+        if (configDTO.getGiftStoreId() != null && configDTO.getGiftStoreId() == packageOrder.getStoreId() && packageOrder.getCompanyId() != null && packageOrder.getCompanyId() > 0 && packageOrder.getPayType().equals(1) && packageOrder.getPayMoney().compareTo(configDTO.getGiftPrice()) >= 0) {
+            if (configDTO.getGift() != null && !configDTO.getGift().isEmpty()) {
+                for (StoreOrderProductDTO product : configDTO.getGift()) {
+                    totalNum = totalNum + product.getCount();
+                    FsStoreOrderItem item = new FsStoreOrderItem();
+                    item.setProductId(product.getProductId());
+                    item.setStoreId(fsPackage.getStoreId());
+                    item.setProductAttrValueId(product.getId());
+                    item.setNum(Long.parseLong(product.getCount().toString()));
+                    FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
+                    dto.setImage(product.getImage());
+                    dto.setNum(Long.parseLong(product.getCount().toString()));
+                    dto.setProductName(product.getProductName());
+                    dto.setProductId(product.getProductId());
+                    dto.setSku(product.getSku());
+                    dto.setBarCode(product.getBarCode());
+                    dto.setPrice(product.getPrice());
+                    if (product.getCount() != null) {
+                        dto.setNum(Long.parseLong(product.getCount().toString()));
+                    }
+                    dto.setImage(product.getImage());
+                    item.setIsPrescribe(0);
+                    item.setJsonInfo(JSON.toJSONString(dto));
+                    item.setIsGift(1);
+                    items.add(item);
+                    fsPackageOrder.setProductCostPrice(packageOrder.getProductCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setTotalCostPrice(packageOrder.getTotalCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setCostDiscountMoney(packageOrder.getCostDiscountMoney().subtract(product.getCostPrice()));
+                }
+            }
+        }
+        //物流代收赠品
+        if (configDTO.getGiftStoreId() != null && configDTO.getGiftStoreId() == packageOrder.getStoreId() && packageOrder.getCompanyId() != null && packageOrder.getCompanyId() > 0 && packageOrder.getPayType().equals(2) && packageOrder.getPayPrice().compareTo(configDTO.getGiftPrice()) >= 0) {
+            if (configDTO.getDeliveryGift() != null && !configDTO.getDeliveryGift().isEmpty()) {
+                for (StoreOrderProductDTO product : configDTO.getDeliveryGift()) {
+                    totalNum = totalNum + product.getCount();
+                    FsStoreOrderItem item = new FsStoreOrderItem();
+                    item.setProductId(product.getProductId());
+                    item.setStoreId(fsPackage.getStoreId());
+                    item.setProductAttrValueId(product.getId());
+                    item.setNum(Long.parseLong(product.getCount().toString()));
+                    FsStoreOrderItemDTO dto = new FsStoreOrderItemDTO();
+                    dto.setImage(product.getImage());
+                    dto.setNum(Long.parseLong(product.getCount().toString()));
+                    dto.setProductName(product.getProductName());
+                    dto.setProductId(product.getProductId());
+                    dto.setSku(product.getSku());
+                    dto.setBarCode(product.getBarCode());
+                    dto.setPrice(product.getPrice());
+                    if (product.getCount() != null) {
+                        dto.setNum(Long.parseLong(product.getCount().toString()));
+                    }
+                    dto.setImage(product.getImage());
+                    item.setIsPrescribe(0);
+                    item.setJsonInfo(JSON.toJSONString(dto));
+                    item.setIsGift(1);
+                    items.add(item);
+                    fsPackageOrder.setProductCostPrice(packageOrder.getProductCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setTotalCostPrice(packageOrder.getTotalCostPrice().add(product.getCostPrice()));
+                    fsPackageOrder.setCostDiscountMoney(packageOrder.getCostDiscountMoney().subtract(product.getCostPrice()));
+                }
+            }
+        }
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.store");
+        Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
+        Integer followRate = (Integer) config.get("followRate");
+        Long followDoctorId = fsPackageOrderMapper.selectFsPackageOrderByUserId(order.getUserId());
+        if (followDoctorId != null && followDoctorId > 0) {
+            order.setFollowDoctorId(followDoctorId);
+        } else {
+            if (packageOrder.getCompanyId() != null) {
+                Company company = companyService.selectCompanyById(packageOrder.getCompanyId());
+                if (company != null) {
+                    String followDoctorIdsJson = company.getFollowDoctorIds();
+                    if (followDoctorIdsJson != null && followDoctorIdsJson != "") {
+                        long[] ids = JSON.parseObject(followDoctorIdsJson, long[].class);
+                        if (ids.length > 0) {
+                            Random random = new Random();
+                            // 从数组中随机选择一个数字
+                            int randomIndex = random.nextInt(ids.length);
+                            long randomId = ids[randomIndex];
+                            order.setFollowDoctorId(randomId);
+                        }
+                    }
+                }
+            }
+            if (order.getFollowDoctorId() == null) {
+                order.setFollowDoctorId(iFsDoctorService.selectFollowDoctorDoctorByPackage());
+            }
+        }
+
+        order.setOrderType(fsPackage.getProductType());
+        order.setTotalNum(totalNum);
+        order.setTotalPrice(totalPrice);
+        order.setPayPrice(packageOrder.getPayPrice());
+        order.setPayMoney(packageOrder.getPayMoney());
+        order.setIsPay(0);
+        order.setItemJson(JSONUtil.toJsonStr(items));
+
+        if (packageOrder.getCycle() >= followRate) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.add(Calendar.DAY_OF_MONTH, followRate);
+            order.setFollowTime(calendar.getTime());
+            order.setCycle(packageOrder.getCycle());
+            Calendar calendar2 = Calendar.getInstance();
+            calendar2.setTime(new Date());
+            calendar2.add(Calendar.DAY_OF_MONTH, 30 + packageOrder.getCycle());
+            order.setFollowEndTime(calendar2.getTime());
+            order.setFollowStatus(0);
+        }
+        if (fsStoreOrderMapper.insertFsStoreOrder(order) > 0) {
+
+            if (order.getOrderId() == null) {
+                throw new CustomException("订单id为空" + order);
+            }
+            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.CREATE_ORDER.getValue(),
+                    FsStoreOrderLogEnum.CREATE_ORDER.getDesc());
+            fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.UN_PAY_ORDER.getValue(),
+                    FsStoreOrderLogEnum.UN_PAY_ORDER.getDesc());
+
+            if (prescribeId != null) {
+                FsPrescribe fsPrescribe = new FsPrescribe();
+                fsPrescribe.setPrescribeId(prescribeId);
+                fsPrescribe.setStoreOrderId(order.getOrderId());
+                fsPrescribeService.updateFsPrescribe(fsPrescribe);
+            }
+
+            for (FsStoreOrderItem item : items) {
+                item.setOrderId(order.getOrderId());
+                fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
+            }
+            if (noTui) {
+                FsStoreOrder fsStoreOrder = new FsStoreOrder();
+                fsStoreOrder.setOrderId(order.getOrderId());
+                fsStoreOrder.setExtendOrderId("XN");
+                fsStoreOrderMapper.updateFsStoreOrder(fsStoreOrder);
+            }
+            FsUser fsUser = fsUserService.selectFsUserByUserId(order.getUserId());
+            if (fsUser.getIsBuy() == null || fsUser.getIsBuy() == 0) {
+                FsUser u = new FsUser();
+                u.setUserId(order.getUserId());
+                u.setIsBuy(1);
+                fsUserService.updateFsUser(u);
+            }
+        }
+        return order;
+    }
+
+    @Override
+    public List<FsStoreOrder> selectOutTimeOrderList(Integer unPayTime) {
+        return fsStoreOrderMapper.selectOutTimeOrderList(unPayTime);
+    }
+
 }

+ 17 - 0
fs-service/src/main/resources/application-druid-bly-test.yml

@@ -143,5 +143,22 @@ rocketmq:
 openIM:
     secret: openIM123
     userID: imAdmin
+    url: web.im.ysya.top
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
+#是否使用新im
+im:
+    type: OPENIM
+
+cloud_host:
+    company_name: 倍力优
+    projectCode: bly
+#看课授权时显示的头像
+headerImg:
+    imgUrl:
+ipad:
+    ipadUrl:
+    aiApi:
+wx_miniapp_temp:
+    pay_order_temp_id:
+    inquiry_temp_id:

+ 2 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/CourseScrmController.java

@@ -89,7 +89,8 @@ public class CourseScrmController extends AppBaseController {
     @GetMapping("/getCourseCate")
     public R getCourseCate(){
         try {
-            List<OptionsVO> list = courseCategoryService.selectFsUserCourseCategoryPidList();
+            Integer isShow = null;
+            List<OptionsVO> list = courseCategoryService.selectFsUserCourseCategoryPidList(isShow);
             return R.ok().put("data",list);
         } catch (Exception e){
             return R.error("操作异常");