Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fs-service-system/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java
#	fs-service-system/src/main/java/com/fs/store/service/IFsStorePaymentService.java
#	fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java
zyp 4 days ago
parent
commit
1c1ed82802

+ 7 - 0
fs-admin/src/main/java/com/fs/course/task/VideoTask.java

@@ -11,6 +11,7 @@ import com.fs.course.mapper.FsUserVideoMapper;
 import com.fs.course.service.IFsUserVideoCommentService;
 import com.fs.store.domain.FsUser;
 import com.fs.store.mapper.FsUserMapper;
+import com.fs.store.service.IFsStorePaymentService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -171,5 +172,11 @@ public class VideoTask {
         return date1.isEqual(date2);
     }
 
+    @Autowired
+    private IFsStorePaymentService storePaymentService;
+    public void bufa() {
+        storePaymentService.bufaRedPacket();;
+    }
+
 
 }

+ 1 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -122,6 +122,7 @@ public class FsUserCourseVideoController extends AppBaseController {
         // type 2 未完播---看课中断
         // 管理员看整个公司 否则看自己的
         CompanyUser companyUser = companyUserService.selectCompanyUserByUserId(Long.parseLong(getUserId()));
+        System.out.println(":进入到接口了");
         if (companyUser.isAdmin()) {
             params.put("companyId", companyUser.getCompanyId());
         } else {

+ 7 - 4
fs-service-system/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java

@@ -166,9 +166,12 @@ public interface FsCourseRedPacketLogMapper
     @Select("SELECT company_id, SUM(amount) as money FROM fs_course_red_packet_log    WHERE status = 0 and create_time >= DATE_SUB(CURDATE(), INTERVAL 2 DAY)  AND create_time < DATE_SUB(CURDATE(), INTERVAL 1 DAY) GROUP BY company_id  ")
     List<RedPacketMoneyVO> selectFsCourseAddRedPacketLogByCompany();
 
-    @Select("SELECT * \n" +
-            "FROM fs_course_red_packet_log \n" +
-            "WHERE status = 0 \n" +
-            "  AND create_time BETWEEN '2025-07-17 00:00:00' AND '2025-07-18 16:30:00'")
+    @Select("SELECT * FROM fs_course_red_packet_log \n" +
+            "WHERE create_time <= DATE_SUB(NOW(), INTERVAL 10 MINUTE)  -- 10 分钟前或更早\n" +
+            "AND create_time >= DATE(NOW())  -- 但必须是今天\n" +
+            "AND status = 0;")
     List<FsCourseRedPacketLog> selectFail();
+
+    @Select("SELECT * FROM fs_course_red_packet_log WHERE status = 0 and create_time > DATE_SUB(NOW(), INTERVAL 2 day) and company_user_id =#{userId}")
+    List<FsCourseRedPacketLog> selectFail(@Param("userId") Long userId);
 }

+ 2 - 2
fs-service-system/src/main/java/com/fs/erp/service/impl/WdtErpGoodsServiceImpl.java

@@ -100,8 +100,8 @@ public class WdtErpGoodsServiceImpl implements IErpGoodsService {
                 for (ErpWdtStockDTO stock : stocks) {
                     ErpGoodsStock erpGoodsStock = new ErpGoodsStock();
                     erpGoodsStock.setBarcode(barcode);
-                    erpGoodsStock.setQty(stock.getStock_num());
-                    erpGoodsStock.setSalable_qty(stock.getAvaliable_num());
+                    erpGoodsStock.setQty(stock.getStock_num().split("\\.")[0]); //999979.0000
+                    erpGoodsStock.setSalable_qty(stock.getAvaliable_num().split("\\.")[0]); //999976.0000
                     list.add(erpGoodsStock);
                 }
             } else {

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsStoreOrder.java

@@ -261,4 +261,6 @@ public class FsStoreOrder extends BaseEntity
 
     private BigDecimal serviceFee;
 
+    private Integer orderMedium; //媒体来源
+
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderCreateParam.java

@@ -51,4 +51,7 @@ public class FsStoreOrderCreateParam implements Serializable
     private Long customerId;
 
     private BigDecimal amount; //货到付款代收金额
+
+    private Integer orderType; //订单类型
+    private Integer orderMedium; //媒体来源
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderCreateUserParam.java

@@ -30,4 +30,6 @@ public class FsStoreOrderCreateUserParam implements Serializable
     private BigDecimal payPrice; //改价 订单总价
     private Long customerId;
     private BigDecimal amount; //货到付款代收金额
+    private Integer orderType; //订单类型
+    private Integer orderMedium; //媒体来源
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsStorePaymentService.java

@@ -113,4 +113,6 @@ public interface IFsStorePaymentService
     R sendRedPacketTest(WxSendRedPacketParam param);
 
     void bufaRedPacket();
+
+    R sendRewardByTest(Long userId);
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java

@@ -230,7 +230,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
         if(StringUtils.isEmpty(productAttrValue.getGroupBarCode())){
             //单品
             ErpGoodsStockQueryRequert queryRequert = new ErpGoodsStockQueryRequert();
-            queryRequert.setBarcode(productAttrValue.getGroupBarCode());
+            queryRequert.setBarcode(productAttrValue.getBarCode());
             ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStock(queryRequert);
             if(goodsStock != null && goodsStock.getStocks() != null && !goodsStock.getStocks().isEmpty()){
 

+ 46 - 23
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -618,6 +618,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             if (storeOrder.getCustomerId() == null){
                 storeOrder.setCustomerId(param.getCustomerId());//6.13 添加客户id
             }
+            storeOrder.setOrderType(param.getOrderType());
+            storeOrder.setOrderMedium(param.getOrderMedium());
             Integer flag=fsStoreOrderMapper.insertFsStoreOrder(storeOrder);
             if (flag==0) {
                 return R.error("订单创建失败");
@@ -1030,6 +1032,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             createParam.setCustomerId(param.getCustomerId());
             createParam.setAmount(param.getAmount());
             createParam.setOrderCreateType(3); //后台制单
+            createParam.setOrderType(param.getOrderType());
+            createParam.setOrderMedium(param.getOrderMedium()); //后台制单
             return this.createOrder(param.getUserId(),createParam);
         }
         else{
@@ -1298,17 +1302,27 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 }
             }
 
+            FsErpConfig erpConfig = configUtil.getErpConfig();
+            Integer erpType = erpConfig.getErpType();
+            Integer erpOpen = erpConfig.getErpOpen();
+            if (erpOpen != null && erpOpen == 1) {
+                if (erpType != null && erpType==2){
+                    // 同步订单完成状态到erp
+                    // 如果是物流代收 或者 货到付款
+                    if("2".equals(order.getPayType()) || "3".equals(order.getPayType())){
+                        // 已结算
+                        if("1".equals(order.getDeliveryPayStatus())){
+                            FsErpFinishPush fsErpFinishPush = new FsErpFinishPush();
+                            fsErpFinishPush.setOrderId(order.getId());
+                            fsErpFinishPush.setTaskStatus(0);
+                            fsErpFinishPush.setRetryCount(0);
+                            fsErpFinishPush.setCreateTime(new Date());
+                            fsErpFinishPushMapper.insert(fsErpFinishPush);
+                        }
+                    }
+                }
+            }
 
-//            // 同步订单完成状态到erp
-//            // 如果是线上支付
-//            if("1".equals(order.getPayType())){
-//                FsErpFinishPush fsErpFinishPush = new FsErpFinishPush();
-//                fsErpFinishPush.setOrderId(orderId);
-//                fsErpFinishPush.setTaskStatus(0);
-//                fsErpFinishPush.setRetryCount(0);
-//                fsErpFinishPush.setCreateTime(new Date());
-//                fsErpFinishPushMapper.insert(fsErpFinishPush);
-//            }
 
             //模板消息支付成功发布事件
             TemplateBean templateBean = TemplateBean.builder()
@@ -2252,19 +2266,28 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                         importSuccessMsg.append("<br/>" + successNum + "、快递单号 " +dto.getDeliveryId() + " 导入成功");
 
 
-                        // 同步订单完成状态到erp
-                        // 如果是物流代收 或者 货到付款
-//                        if("2".equals(order.getPayType()) || "3".equals(order.getPayType())){
-//                            // 已结算
-//                            if("1".equals(dto.getDeliveryPayStatus())){
-//                                FsErpFinishPush fsErpFinishPush = new FsErpFinishPush();
-//                                fsErpFinishPush.setOrderId(order.getId());
-//                                fsErpFinishPush.setTaskStatus(0);
-//                                fsErpFinishPush.setRetryCount(0);
-//                                fsErpFinishPush.setCreateTime(new Date());
-//                                fsErpFinishPushMapper.insert(fsErpFinishPush);
-//                            }
-//                        }
+                        FsErpConfig erpConfig = configUtil.getErpConfig();
+                        Integer erpType = erpConfig.getErpType();
+                        Integer erpOpen = erpConfig.getErpOpen();
+                        if (erpOpen != null && erpOpen == 1) {
+                            if (erpType != null && erpType==2){
+                                // 同步订单完成状态到erp
+                                // 如果是物流代收 或者 货到付款
+                                if("2".equals(order.getPayType()) || "3".equals(order.getPayType())){
+                                    // 已结算
+                                    if("1".equals(dto.getDeliveryPayStatus())){
+                                        FsErpFinishPush fsErpFinishPush = new FsErpFinishPush();
+                                        fsErpFinishPush.setOrderId(order.getId());
+                                        fsErpFinishPush.setTaskStatus(0);
+                                        fsErpFinishPush.setRetryCount(0);
+                                        fsErpFinishPush.setCreateTime(new Date());
+                                        fsErpFinishPushMapper.insert(fsErpFinishPush);
+                                    }
+                                }
+                            }
+                        }
+
+
                     }
                     else{
                         String msg = "<br/>" + failureNum + "、快递单号 " + dto.getDeliveryId() + " 未签收或已导入,不能导入";

+ 46 - 6
fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java

@@ -6,8 +6,6 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -25,8 +23,6 @@ import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.RedPacketConfig;
-import com.fs.course.domain.FsCourseRedPacketLog;
-import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.service.IFsCourseRedPacketLogService;
 import com.fs.pay.pay.config.PayConfig;
 import com.fs.pay.pay.domain.CreateWxOrderResult;
@@ -36,7 +32,6 @@ import com.fs.store.param.FsStoreStatisticsParam;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.store.vo.FsStorePaymentStatisticsVO;
 import com.fs.system.service.ISysConfigService;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
 import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.wx.pay.config.WxPayProperties;
 import com.fs.store.domain.FsUser;
@@ -58,7 +53,6 @@ import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.TransferService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
-import me.chanjar.weixin.common.error.WxErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -680,5 +674,51 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
             }
 
         }
+
+//        Thread.sleep(30000);
+//        List<FsCourseRedPacketLog> logs2 = redPacketLogMapper.selectFail();
+//        String appId = "wx414427b10866c04e";
+//        for (FsCourseRedPacketLog log : logs){
+//            FsUser user = userService.selectFsUserById(log.getUserId());
+//            WxSendRedPacketParam param = new WxSendRedPacketParam();
+//            param.setAppId(appId);
+//            if (user==null || user.getMaOpenId()==null){
+//                continue;
+//            }
+//            param.setOpenId(user.getMaOpenId());
+//            param.setAmount(log.getAmount());
+//            R r = this.sendRedPacketTest(param);
+//            if (r.get("code").equals(200)){
+//                log.setOutBatchNo(r.get("orderCode").toString());
+//                log.setBatchId(r.get("batchId").toString());
+//                redPacketLogMapper.updateFsCourseRedPacketLog(log);
+//                logger.info("更新完成:{}",log.getLogId());
+//            }
+//
+//        }
     }
+
+    @Override
+    public R sendRewardByTest(Long userId) {
+        List<FsCourseRedPacketLog> logs = redPacketLogMapper.selectFail(userId);
+        String appId = "wx414427b10866c04e";
+        for (FsCourseRedPacketLog log : logs) {
+            FsUser user = userService.selectFsUserById(log.getUserId());
+            WxSendRedPacketParam param = new WxSendRedPacketParam();
+            param.setAppId(appId);
+            if (user == null || user.getMaOpenId() == null) {
+                continue;
+            }
+            param.setOpenId(user.getMaOpenId());
+            param.setAmount(log.getAmount());
+            R r = this.sendRedPacketTest(param);
+            if (r.get("code").equals(200)) {
+                log.setOutBatchNo(r.get("orderCode").toString());
+                log.setBatchId(r.get("batchId").toString());
+                redPacketLogMapper.updateFsCourseRedPacketLog(log);
+                logger.info("更新完成:{}", log.getLogId());
+            }
+        }
+        return R.ok();
+        }
 }

+ 3 - 1
fs-service-system/src/main/resources/application-druid-bly-test.yml

@@ -1,5 +1,7 @@
 # 数据源配置
 spring:
+    profiles:
+        include: config-bly,common
     # redis 配置
     redis:
         # 地址
@@ -28,7 +30,7 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://113.44.133.86:3306/bly_store_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    url: jdbc:mysql://113.44.133.86:3306/bly_store?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                     username: root
                     password: bly@2025
                 # 从库数据源

+ 5 - 1
fs-service-system/src/main/resources/mapper/store/FsStoreOrderMapper.xml

@@ -88,10 +88,11 @@ 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="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 from fs_store_order
+        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,order_medium from fs_store_order
     </sql>
 
     <select id="selectFsStoreOrderList" parameterType="FsStoreOrder" resultMap="FsStoreOrderResult">
@@ -242,6 +243,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deliverySendTime != null">delivery_send_time,</if>
             <if test="orderVisit != null">order_visit,</if>
             <if test="serviceFee != null">service_fee,</if>
+            <if test="orderMedium != null">order_medium,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderCode != null and orderCode != ''">#{orderCode},</if>
@@ -323,6 +325,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deliverySendTime != null">#{deliverySendTime},</if>
             <if test="orderVisit != null">#{orderVisit},</if>
             <if test="serviceFee != null">#{serviceFee},</if>
+            <if test="orderMedium != null">#{orderMedium},</if>
          </trim>
     </insert>
 
@@ -410,6 +413,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="scheduleId != null">schedule_id = #{scheduleId},</if>
             <if test="orderVisit != null">order_visit = #{orderVisit},</if>
             <if test="serviceFee != null">service_fee = #{serviceFee},</if>
+            <if test="orderMedium != null">order_medium = #{orderMedium},</if>
         </trim>
         where id = #{id}
     </update>

+ 3 - 1
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -101,6 +101,7 @@
     <select id="selectFsUserList" parameterType="FsUser" resultMap="FsUserResult">
         <include refid="selectFsUserVo"/>
         <where>
+            <if test="userId != null">and user_id = #{userId}</if>
             <if test="username != null  and username != ''">and username like concat('%', #{username}, '%')</if>
             <if test="password != null  and password != ''">and password = #{password}</if>
             <if test="realName != null  and realName != ''">and real_name like concat('%', #{realName}, '%')</if>
@@ -176,9 +177,10 @@
             <if test="registerCode != null   and registerCode != '' ">and register_code = #{registerCode}</if>
             <if test="source != null  and source != '' ">and source = #{source}</if>
             <if test="isShow != null  ">and is_show = #{isShow}</if>
-            <if test="(username != null  and username != '') or (nickname != null  and nickname != '') or (phone != null  and phone != '')">
+            <if test="(username != null  and username != '') or (userId != null  and userId != '') or (nickname != null  and nickname != '') or (phone != null  and phone != '')">
                 and (
                 <if test="username != null  and username != ''">username like concat('%', #{username}, '%')</if>
+                <if test="userId != null  and userId != ''">or user_id = #{userId}</if>
                 <if test="nickname != null  and nickname != ''">or nickname like concat('%', #{nickname}, '%')</if>
                 <if test="phone != null  and phone != ''">or phone like concat('%',#{phone},'%')</if>
                 )

+ 16 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseController.java

@@ -15,6 +15,7 @@ import com.fs.course.service.*;
 import com.fs.course.service.impl.TencentCloudCosService;
 import com.fs.course.vo.*;
 import com.fs.his.vo.OptionsVO;
+import com.fs.store.service.IFsStorePaymentService;
 import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -43,6 +44,8 @@ public class CourseController extends  AppBaseController{
     @Autowired
     private IFsUserCourseService courseService;
     @Autowired
+    private IFsStorePaymentService storePaymentService;
+    @Autowired
     private IFsUserCourseCategoryService courseCategoryService;
 
     @Autowired
@@ -539,4 +542,17 @@ public class CourseController extends  AppBaseController{
         return R.ok().put("data", pageInfo);
     }
 
+
+    /**
+     * 手动根据销售员工信息发放奖励
+     * @param userId
+     * @return
+     */
+    @GetMapping("/sendRewardByTest")
+    public R sendRewardByTest(@RequestBody Long userId)
+    {
+        logger.info("zyp \n【发放奖励】:{}",userId);
+        return  storePaymentService.sendRewardByTest(userId);
+    }
+
 }

+ 266 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxCompanyUserCopyController.java

@@ -0,0 +1,266 @@
+package com.fs.app.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.hutool.core.date.DateTime;
+import com.fs.app.param.LoginMaWxParam;
+import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyDeptService;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+
+import com.fs.his.domain.FsUserWx;
+import com.fs.his.service.IFsUserWxService;
+import com.fs.store.domain.FsUser;
+import com.fs.store.service.IFsUserService;
+import com.fs.system.mapper.SysConfigMapper;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import io.jsonwebtoken.Claims;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+import static com.fs.common.utils.PhoneUtil.encryptPhone;
+
+
+@Api("微信小程序相关接口")
+@RestController
+@RequestMapping(value = "/app/wx/miniapp/test")
+@Slf4j
+public class WxCompanyUserCopyController extends AppBaseController {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private WxMaProperties maProperties;
+
+    @Autowired
+    JwtUtils jwtUtils;
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    private ICompanyUserService companyUserService;
+
+
+    @Autowired
+    private IFsUserService userService;
+
+    @Autowired
+    ICompanyService companyService;
+
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+
+    @Autowired
+    private IFsUserWxService fsUserWxService;
+
+    @ApiOperation("小程序-授权登录")
+    @PostMapping("/loginByMa")
+    public R login(@RequestBody LoginMaWxParam param) {
+        log.info("=====================进入小程序授权登录, 入参: {}", param);
+        if (StringUtils.isBlank(param.getCode())) {
+            return R.error("code不存在");
+        }
+
+        // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
+        Company company = companyService.selectCompanyById(param.getCompanyId());
+        if (company==null || company.getStatus()==0){
+            return R.error("注册失败团队已停用,或不存在!");
+        }
+
+        // 根据销售后台设置的  是否需要单独注册会员 来判断是否需要设置销售的值
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());;
+        if(companyUser == null || companyUser.getStatus().equals("1")){
+            return R.error("注册失败客服已停用,或不存在!");
+        }
+//        if (company.getCourseMiniAppId() == null) {
+//            return R.error("小程序参数错误!");
+//        }
+//        if (!param.getAppId().equals(company.getCourseMiniAppId())){
+//            return R.error("无权限,");
+//        }
+
+        final WxMaService wxService = WxMaConfiguration.getMaService(param.getAppId());
+        try {
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            this.logger.info(session.getSessionKey());
+            this.logger.info(session.getOpenid());
+            this.logger.info(session.getUnionid());
+            if (StringUtils.isEmpty(session.getOpenid())){
+                return R.error("登陆失败,openid未授权,请稍后再试!");
+            }
+
+            // 手机号信息
+            WxMaPhoneNumberInfo phoneNoInfo = new WxMaPhoneNumberInfo();;
+            if (param.getAuthType()==1){
+                phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+                if (StringUtils.isEmpty(phoneNoInfo.getPhoneNumber())){
+                    return R.error("授权失败,请联系客服!");
+                }
+            }
+
+            FsUser user = getUserByAuthType(param, wxService, session, phoneNoInfo);
+
+
+            if (user!=null && user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())) {
+                return R.error(500, "该用户("+user.getUserId() + ")已成为其他销售会员");
+            }
+
+            // 3. 处理用户注册或更新
+            String ip = IpUtil.getRequestIp();
+            user = handleUserRegisterOrUpdate(user, param, session, phoneNoInfo, company, companyUser, ip);
+
+            // 4. 处理用户与小程序的绑定
+            handleFsUserWx(user, param, company, session);
+
+            log.info("保存成功的用户信息user: {}, 用户id: {},小程序AppId:{}", user, user.getUserId(), param.getAppId());
+            String token = jwtUtils.generateToken(user.getUserId());
+            // 返回TOKEN和user
+            return R.ok("登录成功").put("token", token).put("user", user);
+        } catch (WxErrorException e) {
+            this.logger.error(e.getMessage(), e);
+            return R.error("授权失败," + e.getMessage());
+        }
+    }
+
+    /**
+     * 根据authType获取用户信息
+     */
+    private FsUser getUserByAuthType(LoginMaWxParam param, WxMaService wxService, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo) throws WxErrorException {
+        FsUser user = null;
+        if (param.getAuthType() == 1) {
+            user = userService.selectFsUserByPhone(encryptPhone(phoneNoInfo.getPhoneNumber()));
+        } else {
+            // unionid判定唯一
+            if (StringUtils.isNotEmpty(session.getUnionid())) {
+                user = userService.selectFsUserByUnionId(session.getUnionid());
+            }
+        }
+        return user;
+    }
+
+
+    /**
+     * 处理用户注册或更新
+     */
+    private FsUser handleUserRegisterOrUpdate(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser, String ip) {
+        if (user == null) {
+            return createUser(param, session, phoneNoInfo, company, companyUser);
+        } else {
+            return updateUser(user, param, session, phoneNoInfo, company, companyUser);
+        }
+    }
+
+    /**
+     * 新增用户
+     */
+    private FsUser createUser(LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser) {
+        FsUser user = new FsUser();
+        user.setStatus((company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1);
+        user.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+        user.setCreateTime(new Date());
+        if (param.getAuthType() == 1 && phoneNoInfo != null) {
+            user.setPhone(phoneNoInfo.getPhoneNumber());
+        }
+        if((companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
+                && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1){
+            user.setCompanyId(param.getCompanyId());
+            user.setCompanyUserId(param.getCompanyUserId());
+        }
+        userService.insertFsUser(user);
+        return user;
+    }
+
+    /**
+     * 修改用户
+     */
+    private FsUser updateUser(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser) {
+        FsUser userMap = new FsUser();
+        userMap.setUserId(user.getUserId());
+        userMap.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+        userMap.setUpdateTime(new DateTime());
+        if (param.getAuthType() == 1 && phoneNoInfo != null) {
+            userMap.setPhone(phoneNoInfo.getPhoneNumber());
+        }
+        userService.updateFsUser(userMap);
+        return userMap;
+    }
+
+
+    /**
+     * 处理用户与小程序的绑定
+     */
+    private void handleFsUserWx(FsUser user, LoginMaWxParam param, Company company, WxMaJscode2SessionResult session) {
+        if (user == null) return;
+        FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(company.getCourseMiniAppId(), user.getUserId(), 1);
+        if (fsUserWx == null) {
+            fsUserWx = new FsUserWx();
+            fsUserWx.setType(1);
+            fsUserWx.setFsUserId(user.getUserId());
+            fsUserWx.setCompanyId(param.getCompanyId());
+            fsUserWx.setAppId(company.getCourseMiniAppId());
+            fsUserWx.setOpenId(session.getOpenid());
+            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+            fsUserWx.setCreateTime(new Date());
+            fsUserWxService.save(fsUserWx);
+        } else {
+            fsUserWx.setFsUserId(user.getUserId());
+            fsUserWx.setCompanyId(param.getCompanyId());
+            fsUserWx.setAppId(company.getCourseMiniAppId());
+            fsUserWx.setOpenId(session.getOpenid());
+            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+            fsUserWx.setUpdateTime(new Date());
+            fsUserWxService.updateById(fsUserWx);
+        }
+    }
+
+//    @Login(isMiniLogin = true)
+//    @ApiOperation("获取销售通过小程序登录后的用户信息")
+//    @GetMapping("/getMaUser")
+//    public R getUserInfo() {
+//        try {
+//            CompanyUser companyUser = companyUserService.selectCompanyUserById(Long.parseLong(getUserId()));
+//            if (companyUser == null) {
+//                return R.error(401, "用户信息不存在");
+//            }
+//            return R.ok().put("user", companyUser);
+//        } catch (Exception e) {
+//            return R.error("操作异常");
+//        }
+//    }
+
+    /**
+     * 特殊要求:销售小程序临时登录,登录后页面中还有一个之前常用的登录,所以为了区分,token名称不能跟之前的一样
+     *
+     * @return 用户id
+     */
+    public String getUserId() {
+        String headValue = ServletUtils.getRequest().getHeader("UserToken");
+        Claims claims = jwtUtils.getClaimByToken(headValue);
+        String userId = claims.getSubject().toString();
+        return userId;
+    }
+
+
+}