Ver Fonte

1.修复订单详情表返回机具券
2.修复小分仓列表搜索字段
3.订单表同步关联机具券

mac há 2 anos atrás
pai
commit
415d31f354
19 ficheiros alterados com 288 adições e 61 exclusões
  1. 11 4
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/feign/RemoteKxsProductService.java
  2. 6 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/vo/kxsapp/shop/ShopOrderInfoListVO.java
  3. 15 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/MerchantController.java
  4. 8 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsMerchantService.java
  5. 38 5
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsMerchantServiceImpl.java
  6. 2 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java
  7. 5 0
      kxs-store/kxs-store-api/src/main/java/com/kxs/store/api/vo/kxsapp/storeOrder/StoreOrderListVO.java
  8. 1 1
      kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/controller/kxsapp/StoreAdvanceController.java
  9. 2 1
      kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/mapper/KxsMachineAdvanceMapper.java
  10. 4 14
      kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/service/impl/KxsMachineAdvanceServiceImpl.java
  11. 2 2
      kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/service/impl/KxsMachineApplyServiceImpl.java
  12. 31 19
      kxs-store/kxs-store-biz/src/main/resources/mapper/KxsMachineAdvanceMapper.xml
  13. 1 1
      kxs-store/kxs-store-biz/src/main/resources/mapper/KxsMachineApplyMapper.xml
  14. 16 4
      kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsShopOrderService.java
  15. 27 0
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/app/MchRegisterDTO.java
  16. 5 2
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/app/RegisterDTO.java
  17. 15 0
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/KxsAppController.java
  18. 9 0
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserService.java
  19. 90 8
      kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserServiceImpl.java

+ 11 - 4
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/feign/RemoteKxsProductService.java

@@ -4,10 +4,7 @@ package com.kxs.product.api.feign;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.util.R;
 import com.kxs.product.api.dto.kxsapp.GetActivityMachineByIdAndTimeDTO;
-import com.kxs.product.api.model.KxsBrand;
-import com.kxs.product.api.model.KxsMachine;
-import com.kxs.product.api.model.KxsMachineCirculationLog;
-import com.kxs.product.api.model.KxsTicket;
+import com.kxs.product.api.model.*;
 import com.kxs.product.api.vo.kxsapp.shop.ShopOrderGoodsUserVO;
 import com.kxs.stat.api.vo.GetActivityStatByIdAndTimeVO;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -141,4 +138,14 @@ public interface RemoteKxsProductService {
 	@GetExchange("/shop/getDateBetweenOrders")
 	R<List<ShopOrderGoodsUserVO>> getDateBetweenOrders(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime, @RequestHeader(SecurityConstants.FROM) String from);
 
+
+	/**
+	 * 更改为 商户型创客 用户
+	 *
+	 * @param mchInfo MCH信息
+	 * @param from    从
+	 * @return {@link R}
+	 */
+	@PostExchange("/merchant/changeToMchUser")
+	R changeToMchUser(@RequestBody KxsMerchant mchInfo, @RequestHeader(SecurityConstants.FROM) String from);
 }

+ 6 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/vo/kxsapp/shop/ShopOrderInfoListVO.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 商城订单详情表vo
@@ -65,4 +66,9 @@ public class ShopOrderInfoListVO implements Serializable {
     @Schema(description = "商品类型 0实物商品 1虚拟物品")
     private Integer goodsType;
 
+    /**
+     * 券码集合
+     */
+    private List<String> ticketCodes;
+
 }

+ 15 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/controller/kxsapp/MerchantController.java

@@ -2,6 +2,7 @@ package com.kxs.product.biz.controller.kxsapp;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.common.core.util.R;
+import com.kxs.common.security.annotation.Inner;
 import com.kxs.product.api.dto.kxsapp.merchant.ToMerchantMakerDTO;
 import com.kxs.product.api.dto.kxsapp.merchant.MachineRatioDTO;
 import com.kxs.product.api.dto.kxsapp.merchant.MerchantListDTO;
@@ -96,6 +97,20 @@ public class MerchantController {
     }
 
 
+    /**
+     * 转商户型创客注册内部调用
+     *
+     * @param param 实体对象
+     * @return 转商户型创客
+     */
+    @Inner
+    @PostMapping("/changeToMchUser")
+    public R changeToMchUser(@RequestBody KxsMerchant param) {
+
+        return kxsMerchantService.changeToMchUser(param);
+    }
+
+
 
 }
 

+ 8 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsMerchantService.java

@@ -44,5 +44,13 @@ public interface KxsMerchantService extends IService<KxsMerchant> {
      * @return 汇总数据激活等
      */
     Object merchantTotal(Integer brandId);
+
+    /**
+     * 转商户型创客注册内部调用
+     *
+     * @param param 参数
+     * @return {@link R}
+     */
+    R changeToMchUser(KxsMerchant param);
 }
 

+ 38 - 5
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsMerchantServiceImpl.java

@@ -8,8 +8,10 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.constant.enums.MachineTypeEnum;
+import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.AssertUtil;
 import com.kxs.common.core.util.R;
 import com.kxs.common.security.util.SecurityUtils;
@@ -28,6 +30,7 @@ import com.kxs.user.api.feign.RemoteKxsUserService;
 import com.kxs.user.api.model.KxsUser;
 import com.kxs.user.api.model.KxsUserReal;
 import com.kxs.user.api.vo.kxsapp.user.RealUserInfoVO;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.RequiredArgsConstructor;
 import net.bytebuddy.implementation.bytecode.Throw;
 import org.springframework.stereotype.Service;
@@ -79,7 +82,7 @@ public class KxsMerchantServiceImpl extends ServiceImpl<KxsMerchantMapper, KxsMe
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @GlobalTransactional(rollbackFor = Exception.class)
     public R toMerchantMaker(ToMerchantMakerDTO param) {
         Long parenUserId = SecurityUtils.getUser().getId();
         //查询创客
@@ -125,10 +128,10 @@ public class KxsMerchantServiceImpl extends ServiceImpl<KxsMerchantMapper, KxsMe
         KxsUserReal userReal = remoteKxsUserService.loadUserRealById(kxsUser.getId(), SecurityConstants.FROM_IN).getData();
         if (!validCard) {
             //如果脱敏需要验证前6后4
-            String prefix = idCard.substring(0, 6);
+            String prefix = idCard.substring(0, 4);
             String after = idCard.substring(idCard.length() - 4);
             //
-            String realPrefix = userReal.getIdCard().substring(0, 6);
+            String realPrefix = userReal.getIdCard().substring(0, 4);
             String realAfter = userReal.getIdCard().substring(userReal.getIdCard().length() - 4);
             if (!prefix.equals(realPrefix) || !after.equalsIgnoreCase(realAfter)) {
                 return R.failed("当前商户身份信息与转换用户身份信息不一致,请重新核对后重试");
@@ -146,12 +149,12 @@ public class KxsMerchantServiceImpl extends ServiceImpl<KxsMerchantMapper, KxsMe
         }
 
         //可以转换为商户型创客
-        kxsUser.setIsMerchantMaker(1);
+        kxsUser.setIsMerchantMaker(CommonConstants.SUCCESS);
         kxsUser.setUpdateTime(LocalDateTime.now());
         remoteKxsUserService.updateById(kxsUser,SecurityConstants.FROM_IN);
 
         //修改商户类型
-        kxsMerchant.setIsMaker(1);
+        kxsMerchant.setIsMaker(CommonConstants.SUCCESS);
         kxsMerchant.setMakerUserId(kxsUser.getId());
         updateById(kxsMerchant);
         return R.ok();
@@ -163,5 +166,35 @@ public class KxsMerchantServiceImpl extends ServiceImpl<KxsMerchantMapper, KxsMe
         return kxsMerchantMapper.merchantTotal(brandId,id);
     }
 
+    @Override
+    public R changeToMchUser(KxsMerchant param) {
+
+        KxsMerchant mchInfo = getById(param.getId());
+        if (mchInfo == null) {
+            throw new GlobalCustomerException("商户不存在");
+        }
+        if(mchInfo.getMakerUserId() != null){
+            throw new GlobalCustomerException("该商户已是商户型创客");
+        }
+
+        //修改商户类型
+        mchInfo.setIsMaker(CommonConstants.SUCCESS);
+        mchInfo.setMakerUserId(param.getMakerUserId());
+        updateById(mchInfo);
+
+        return R.ok();
+    }
+
+
+
+
+
+
+
+
+
+
+
+
 }
 

+ 2 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java

@@ -149,6 +149,8 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
             ShopOrderInfoListVO infoListVO = new ShopOrderInfoListVO();
             BeanUtils.copyProperties(item, infoListVO);
             infoListVO.setGoodsType(kxsShopGoods.getGoodsType());
+            List<KxsTicket> kxsTickets = kxsTicketMapper.selectList(Wrappers.<KxsTicket>lambdaQuery().eq(KxsTicket::getOrderId, orderId));
+            infoListVO.setTicketCodes(kxsTickets.stream().map(KxsTicket::getTicketCode).collect(Collectors.toList()));
             shopOrderDetailVO.getGoodsList().add(infoListVO);
         });
 

+ 5 - 0
kxs-store/kxs-store-api/src/main/java/com/kxs/store/api/vo/kxsapp/storeOrder/StoreOrderListVO.java

@@ -120,6 +120,11 @@ public class StoreOrderListVO implements Serializable {
     @Schema(description = "品牌id")
     private Long brandId;
 
+    /**
+     * 品牌
+     */
+    private Long brandName;
+
 
 
 	

+ 1 - 1
kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/controller/kxsapp/StoreAdvanceController.java

@@ -46,7 +46,7 @@ public class StoreAdvanceController {
      * @return 小分仓-列表
      */
     @GetMapping("/getUserWareHouseList")
-    public R getUserWareHouseList(@ParameterObject Page<UserWarehouseListVO> page,@RequestParam("keyword") String keyword) {
+    public R getUserWareHouseList(@ParameterObject Page<UserWarehouseListVO> page, @RequestParam(value = "keyword", required = false) String keyword) {
 
         return R.ok(kxsMachineAdvanceService.getUserWareHouseList(page,keyword));
     }

+ 2 - 1
kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/mapper/KxsMachineAdvanceMapper.java

@@ -55,9 +55,10 @@ public interface KxsMachineAdvanceMapper extends BaseMapper<KxsMachineAdvance> {
      *
      * @param sendUserId 发送用户 ID
      * @param toUserId   到用户 ID
+     * @param keyword
      * @return {@link List}<{@link Map}<{@link String}, {@link Object}>>
      */
-    List<Map<String, Object>> selectToUserList(@Param("sendUserId") Long sendUserId, @Param("toUserId") Integer toUserId);
+    List<Map<String, Object>> selectToUserList(@Param("sendUserId") Long sendUserId, @Param("toUserId") Integer toUserId, @Param("keyword") String keyword);
 
     /**
      * 查询用户下所有的待确认预发机

+ 4 - 14
kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/service/impl/KxsMachineAdvanceServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.constant.enums.BrandTypeEnum;
 import com.kxs.common.core.constant.enums.ErrorTypeEnum;
@@ -89,23 +90,11 @@ public class KxsMachineAdvanceServiceImpl extends ServiceImpl<KxsMachineAdvanceM
               通过仓库用户和小分仓用户查询预发机订单的品牌信息
           </p>
          */
-        IPage<UserWarehouseListVO> userWareHouseList = baseMapper.getUserWareHouseList(page, userId,keyword);
-        //todo 添加关键字查询
+        IPage<UserWarehouseListVO> userWareHouseList = baseMapper.getUserWareHouseList(page, userId, keyword);
         for (UserWarehouseListVO record : userWareHouseList.getRecords()) {
 
-            //查询用户信息
-            R<KxsUser> kxsUserR = remoteKxsUserService.loadUserById(record.getUserId(), SecurityConstants.FROM_IN);
-            KxsUser toUser = RetOps.of(kxsUserR)
-                    .getData()
-                    .orElseThrow(() -> new GlobalCustomerException(ErrorTypeEnum.USER_NOT_FOUND.getDescription()));
-            record.setAvatar(toUser.getAvatar());
-            record.setPhone(toUser.getPhone());
-            record.setUserCode(toUser.getUserCode());
-            record.setUsername(toUser.getUsername());
-            record.setUserLevel(toUser.getUserLevel());
-
             //查询仓库用户下所有用户的预发机
-            List<Map<String, Object>> kxsMachineAdvances = baseMapper.selectToUserList(userId, record.getUserId());
+            List<Map<String, Object>> kxsMachineAdvances = baseMapper.selectToUserList(userId, record.getUserId(), keyword == null || keyword.startsWith(CommonConstants.KXS_USER_NUMBER_PREFIX) ? null : keyword);
 
             //按照品牌ID分组
             Map<String, List<Map<String, Object>>> advanceDevMap = kxsMachineAdvances.stream().collect(Collectors.groupingBy((item -> item.get("brandName").toString())));
@@ -120,6 +109,7 @@ public class KxsMachineAdvanceServiceImpl extends ServiceImpl<KxsMachineAdvanceM
                         sn.put("id", info.get("infoId"));//预发机id
                         sn.put("posSn", info.get("posSn"));//机具sn
                         sn.put("isUseAmount", info.get("isUseAmount"));//是否占用语法额度  0否  1是
+                        sn.put("isAdvance", info.get("isAdvance"));//是否预扣款 0否 1是
                         sn.put("isConfirm", info.get("isConfirm"));//是否确认收货  0未确认 1已确认  2已拒绝
                         sn.put("createTime", info.get("createTime"));//创建时间
                         snList.add(sn);

+ 2 - 2
kxs-store/kxs-store-biz/src/main/java/com/kxs/store/biz/service/impl/KxsMachineApplyServiceImpl.java

@@ -391,8 +391,8 @@ public class KxsMachineApplyServiceImpl extends ServiceImpl<KxsMachineApplyMappe
 
     @Override
     public IPage<StoreOrderListVO> getByPage(Page<StoreOrderListVO> page, StoreOrderListDTO param) {
-        Long id = SecurityUtils.getUser().getId();
-        IPage<StoreOrderListVO> byPage = baseMapper.getByPage(page, param,id);
+        Long userId = SecurityUtils.getUser().getId();
+        IPage<StoreOrderListVO> byPage = baseMapper.getByPage(page, param, userId);
         //如果已完成的订单才去查询机具号
         for (StoreOrderListVO orderListVo : byPage.getRecords()) {
             if (Objects.equals(orderListVo.getStatus(), MachineOrderStatusEnum.APPLY_SUCCESSFUL.getType())) {

+ 31 - 19
kxs-store/kxs-store-biz/src/main/resources/mapper/KxsMachineAdvanceMapper.xml

@@ -17,7 +17,7 @@
 
     </resultMap>
     <select id="getByPage" resultType="com.kxs.store.api.vo.kxsapp.store.StoreAdvanceMachineVO">
-        select a.id, a.create_time, info.is_use_amount, info.pos_sn from kxs_machine_advance a
+        select a.id, a.create_time, info.is_use_amount, info.pos_sn, info.is_advance from kxs_machine_advance a
         left join kxs_machine_advance_info info on info.order_id = a.id
         <where>
             and a.del_flag = 0
@@ -30,11 +30,19 @@
 
     </select>
     <select id="getUserWareHouseList" resultType="com.kxs.store.api.vo.kxsapp.storeAdvance.UserWarehouseListVO">
-        select to_user_id as user_id
-        from (select to_user_id
-              from kxs_machine_advance
-              where del_flag = 0 and warehouse_id = #{userId}
-              group by to_user_id) as warehouse_user
+        select user_id, avatar, user_code, username, phone
+        from (select a.to_user_id as user_id, u.avatar, u.user_code, u.username, u.phone
+        from kxs_machine_advance a
+        left join kxs_user.kxs_user u on a.to_user_id = u.id
+        left join kxs_machine_advance_info b on a.id = b.order_id
+        where a.del_flag = 0 and a.send_user_id = #{userId}
+        <if test="keyword != null and keyword != ''">
+            and (u.user_code = #{keyword} or b.pos_sn like concat('%',#{keyword},'%'))
+        </if>
+        and b.is_apply = 0
+        and b.is_return = 0
+        and b.is_confirm = 1
+        group by to_user_id) as warehouse_user
 
 
     </select>
@@ -50,21 +58,25 @@
     </select>
     <select id="selectToUserList" resultType="java.util.Map">
         select a.id,
-               a.brand_id      as brandId,
-               a.brand_name    as brandName,
-               b.id            as infoId,
-               b.pos_sn        as posSn,
-               b.is_use_amount as isUseAmount,
-               b.create_time   as createTime,
-               b.is_confirm    as isConfirm
+        a.brand_id as brandId,
+        a.brand_name as brandName,
+        b.id as infoId,
+        b.pos_sn as posSn,
+        b.is_use_amount as isUseAmount,
+        b.create_time as createTime,
+        b.is_confirm as isConfirm,
+        b.is_advance as isAdvance
         from kxs_machine_advance a
-                 left join kxs_machine_advance_info b on a.id = b.order_id
+        left join kxs_machine_advance_info b on a.id = b.order_id
         where a.del_flag = 0
-          and a.send_user_id = #{sendUserId}
-          and a.to_user_id = #{toUserId}
-          and b.is_apply = 0
-          and b.is_return = 0
-          and b.is_confirm = 1
+        <if test="keyword != null and keyword != ''">
+            and b.pos_sn like concat('%',#{keyword},'%')
+        </if>
+        and a.send_user_id = #{sendUserId}
+        and a.to_user_id = #{toUserId}
+        and b.is_apply = 0
+        and b.is_return = 0
+        and b.is_confirm = 1
     </select>
 
     <resultMap type="com.kxs.store.api.vo.kxsapp.userAdvance.AdvanceDevModalVO" id="AdvanceDevModalMap">

+ 1 - 1
kxs-store/kxs-store-biz/src/main/resources/mapper/KxsMachineApplyMapper.xml

@@ -29,7 +29,7 @@
 
     </resultMap>
     <select id="getByPage" resultType="com.kxs.store.api.vo.kxsapp.storeOrder.StoreOrderListVO">
-        select a.id, a.create_time, a.order_sn, a.get_mode, a.apply_num, a.contacts, a.phone, a.address, a.apply_type, a.status, a.username, a.user_code a.brand_id from kxs_machine_apply a
+        select a.id, a.create_time, a.order_sn, a.get_mode, a.apply_num, a.contacts, a.phone, a.address, a.apply_type, a.status, a.username, a.user_code, a.brand_id, a.brand_name from kxs_machine_apply a
         <where>
             and user_id = #{userId}
             <if test="query.brandId != null and query.brandId != 0">

+ 16 - 4
kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsShopOrderService.java

@@ -6,16 +6,14 @@ import cn.hutool.core.util.StrUtil;
 import com.aliyun.dts.subscribe.clients.record.OperationType;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.kxs.product.api.model.KxsMachine;
-import com.kxs.product.api.model.KxsShopGoods;
-import com.kxs.product.api.model.KxsShopOrder;
-import com.kxs.product.api.model.KxsShopOrderInfo;
+import com.kxs.product.api.model.*;
 import com.kxs.store.api.model.KxsMachineApplyDetail;
 import com.kxs.system.api.model.KxsMorningLog;
 import com.kxs.system.api.model.KxsSchoolMenu;
 import com.kxs.transfer.api.mapper.product.KxsMachineMapper;
 import com.kxs.transfer.api.mapper.product.KxsShopOrderInfoMapper;
 import com.kxs.transfer.api.mapper.product.KxsShopOrderMapper;
+import com.kxs.transfer.api.mapper.product.KxsTicketMapper;
 import com.kxs.transfer.api.mapper.store.KxsMachineApplyDetailMapper;
 import com.kxs.transfer.api.mapper.store.KxsMachineApplyMapper;
 import com.kxs.transfer.api.model.table.DMLData;
@@ -42,6 +40,8 @@ public class KxsShopOrderService extends ServiceImpl<KxsShopOrderMapper, KxsShop
     private final KxsMachineMapper kxsMachineMapper;
 
     private final KxsMachineApplyDetailMapper kxsMachineApplyDetailMapper;
+    private final KxsTicketMapper kxsTicketMapper;
+
 
     public void changeData(DMLData dmlData) {
         //修改的字段值
@@ -75,6 +75,18 @@ public class KxsShopOrderService extends ServiceImpl<KxsShopOrderMapper, KxsShop
                 }
             }
             return;
+        }else{
+            //机具券订单
+            if(fieldDataMap.get("SnNos").getValue() != null){
+                String sns = fieldDataMap.get("SnNos").getValue().toString();
+                List<KxsTicket> kxsTickets = kxsTicketMapper.selectList(Wrappers.<KxsTicket>lambdaQuery().in(KxsTicket::getTicketCode, sns));
+                if(kxsTickets != null){
+                    for (KxsTicket kxsTicket : kxsTickets) {
+                        kxsTicket.setOrderId(Integer.valueOf(dmlData.getId()));
+                        kxsTicketMapper.updateById(kxsTicket);
+                    }
+                }
+            }
         }
         //操作的主键
         int id = Integer.parseInt(dmlData.getId());

+ 27 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/app/MchRegisterDTO.java

@@ -0,0 +1,27 @@
+package com.kxs.user.api.dto.kxsapp.app;
+
+import com.kxs.common.core.valid.Phone;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
+
+
+/**
+ * 商户型创客注册dto
+ *
+ * @author 没秃顶的码农
+ * @date 2024-06-06
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class MchRegisterDTO extends RegisterDTO{
+
+	/**
+	 * 商户ID
+	 */
+	@NotBlank(message = "商户ID不能为空")
+	@Phone
+	private Integer mchId;
+
+}

+ 5 - 2
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/dto/kxsapp/app/RegisterDTO.java

@@ -5,9 +5,12 @@ import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
+
 /**
- * @author lengleng
- * @date 2017/11/5
+ * 注册 DTO
+ *
+ * @author 没秃顶的码农
+ * @date 2024-06-06
  */
 @Data
 public class RegisterDTO {

+ 15 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/controller/kxsapp/KxsAppController.java

@@ -4,6 +4,7 @@ package com.kxs.user.biz.controller.kxsapp;
 import cn.hutool.core.util.StrUtil;
 import com.kxs.common.core.util.R;
 import com.kxs.common.security.annotation.Inner;
+import com.kxs.user.api.dto.kxsapp.app.MchRegisterDTO;
 import com.kxs.user.api.dto.kxsapp.app.RegisterDTO;
 import com.kxs.user.api.dto.kxsapp.app.ForgetPwdDTO;
 import com.kxs.user.biz.service.KxsUserService;
@@ -44,6 +45,20 @@ public class KxsAppController {
         return kxsUserService.register(registerDTO);
     }
 
+    /**
+     * 商户型创客注册
+     *
+     * @param registerDTO 注册dto
+     * @return {@link R}
+     */
+    @PostMapping("/mchRegister")
+    @Inner(value = false)
+    public R mchRegister(@Valid @RequestBody MchRegisterDTO registerDTO)
+    {
+
+        return kxsUserService.mchRegister(registerDTO);
+    }
+
     /**
      * 发送验证码
      *

+ 9 - 0
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/KxsUserService.java

@@ -5,6 +5,7 @@ import com.kxs.common.core.util.R;
 import com.kxs.product.api.vo.kxsapp.excel.ExistPayPwdVO;
 import com.kxs.user.api.dto.kxsapp.ConcealParentDTO;
 import com.kxs.user.api.dto.kxsapp.app.ForgetPwdDTO;
+import com.kxs.user.api.dto.kxsapp.app.MchRegisterDTO;
 import com.kxs.user.api.dto.kxsapp.app.RegisterDTO;
 import com.kxs.user.api.dto.kxsapp.user.*;
 import com.kxs.user.api.model.KxsUser;
@@ -265,5 +266,13 @@ public interface KxsUserService extends IService<KxsUser> {
      * @return 隐藏推荐关系
      */
     R concealParent(ConcealParentDTO concealParentDTO);
+
+    /**
+     * 商户型创客注册
+     *
+     * @param registerDTO 注册 DTO
+     * @return {@link R}
+     */
+    R mchRegister(MchRegisterDTO registerDTO);
 }
 

+ 90 - 8
kxs-user/kxs-user-biz/src/main/java/com/kxs/user/biz/service/impl/KxsUserServiceImpl.java

@@ -22,6 +22,7 @@ import com.kxs.common.core.util.R;
 import com.kxs.common.core.util.SpringContextHolder;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.product.api.feign.RemoteKxsProductService;
+import com.kxs.product.api.model.KxsMerchant;
 import com.kxs.product.api.vo.kxsapp.excel.ExistPayPwdVO;
 import com.kxs.store.api.feign.RemoteKxsStoreService;
 import com.kxs.store.api.model.KxsWarehouseLimit;
@@ -30,6 +31,7 @@ import com.kxs.system.api.model.KxsUserMsg;
 import com.kxs.system.api.util.MsgTemplateUtil;
 import com.kxs.user.api.dto.kxsapp.ConcealParentDTO;
 import com.kxs.user.api.dto.kxsapp.app.ForgetPwdDTO;
+import com.kxs.user.api.dto.kxsapp.app.MchRegisterDTO;
 import com.kxs.user.api.dto.kxsapp.app.RegisterDTO;
 import com.kxs.user.api.dto.kxsapp.user.*;
 import com.kxs.user.api.model.*;
@@ -103,12 +105,9 @@ public class KxsUserServiceImpl extends ServiceImpl<KxsUserMapper, KxsUser> impl
     private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
     
     @Override
-    @GlobalTransactional
-    @Transactional(rollbackFor = Exception.class)
+    @GlobalTransactional(rollbackFor = Exception.class)
     public R register(RegisterDTO registerDTO) {
 
-        AssertUtil.isPhone(registerDTO.getPhone());
-
         //验证码校验
         checkValidateCode(registerDTO.getPhone(), registerDTO.getCode());
 
@@ -130,9 +129,7 @@ public class KxsUserServiceImpl extends ServiceImpl<KxsUserMapper, KxsUser> impl
         //查询上级用户
         KxsUser inviteUser = baseMapper.selectOne(Wrappers.<KxsUser>lambdaQuery().eq(KxsUser::getUserCode, registerDTO.getUserCode()));
         if(inviteUser == null){
-            inviteUser = new KxsUser();
-            inviteUser.setId(0);
-//            return R.failed(UserErrorTypeEnum.PARENT_IS_NULL.getDescription());
+            return R.failed(UserErrorTypeEnum.PARENT_IS_NULL.getDescription());
         }
 
         kxsUser.setPid(inviteUser.getId());
@@ -145,7 +142,7 @@ public class KxsUserServiceImpl extends ServiceImpl<KxsUserMapper, KxsUser> impl
         baseMapper.insert(kxsUser);
 
         //会员序号/推荐码
-        String number = String.format("%08d", kxsUser.getId());
+        String number = String.format("%07d", kxsUser.getId());
         kxsUser.setUserCode(CommonConstants.KXS_USER_NUMBER_PREFIX + number);
 
         if (CharSequenceUtil.isBlank(inviteUser.getPidPath())){
@@ -180,6 +177,90 @@ public class KxsUserServiceImpl extends ServiceImpl<KxsUserMapper, KxsUser> impl
         
     }
 
+
+    @Override
+    @GlobalTransactional(rollbackFor = Exception.class)
+    public R mchRegister(MchRegisterDTO registerDTO) {
+
+        //验证码校验
+        checkValidateCode(registerDTO.getPhone(), registerDTO.getCode());
+
+        //查询是否注销
+        KxsUser isRemove = baseMapper.selectOne(Wrappers.<KxsUser>lambdaQuery().eq(KxsUser::getPhone, registerDTO.getPhone() + "d"));
+        if(isRemove != null && isRemove.getUpdateTime() != null && LocalDateTime.now().isBefore(isRemove.getUpdateTime().plusDays(30))){
+            return R.failed(UserErrorTypeEnum.USER_REMOVE.getDescription());
+        }
+        KxsUser exUser = baseMapper.selectOne(Wrappers.<KxsUser>lambdaQuery().eq(KxsUser::getPhone, registerDTO.getPhone()));
+        if(exUser != null){
+            return R.failed(UserErrorTypeEnum.PHONE_IS_EX.getDescription());
+        }
+
+        KxsUser kxsUser = new KxsUser();
+        BeanUtils.copyProperties(registerDTO, kxsUser);
+        kxsUser.setUserCode(null);
+        kxsUser.setStatus(UserStatusEnum.NORMAL.getCode());
+
+        //查询上级用户
+        KxsUser inviteUser = baseMapper.selectOne(Wrappers.<KxsUser>lambdaQuery().eq(KxsUser::getUserCode, registerDTO.getUserCode()));
+        if(inviteUser == null){
+            return R.failed(UserErrorTypeEnum.PARENT_IS_NULL.getDescription());
+        }
+
+        kxsUser.setPid(inviteUser.getId());
+        //加盐
+        String salt = UUID.randomUUID().toString();
+        kxsUser.setSalt(salt);
+        //登陆密码
+        kxsUser.setPassword(ENCODER.encode(registerDTO.getPassword() + salt));
+        kxsUser.setIsMerchantMaker(CommonConstants.SUCCESS);
+        //保存用户注册信息
+        baseMapper.insert(kxsUser);
+
+        //会员序号/推荐码
+        String number = String.format("%07d", kxsUser.getId());
+        kxsUser.setUserCode(CommonConstants.KXS_USER_NUMBER_PREFIX + number);
+
+        if (CharSequenceUtil.isBlank(inviteUser.getPidPath())){
+            kxsUser.setPidPath("0");
+        } else {
+            //  拼接上级推荐人的用户ID字符串;如:0,1,2,3,4,5,...用英文逗号隔开
+            String superIdTree = (inviteUser.getPidPath().length() == 1 ? inviteUser.getPidPath() + "," : inviteUser.getPidPath()) + inviteUser.getId() + ",";
+            kxsUser.setPidPath(superIdTree);
+        }
+        //更新
+        baseMapper.updateById(kxsUser);
+
+        //添加用户账户表
+        KxsUserAmount kxsUserAmount = new KxsUserAmount();
+        kxsUserAmount.setUserId(kxsUser.getId());
+        kxsUserAmount.setId(kxsUser.getId());
+        userAmountMapper.insert(kxsUserAmount);
+
+        //初始化用户预发额度表
+        KxsWarehouseLimit kxsWarehouseLimit = new KxsWarehouseLimit();
+        kxsWarehouseLimit.setUserId(kxsUser.getId());
+        R<Boolean> booleanR = remoteKxsStoreService.addUserAdvanceLimit(kxsWarehouseLimit, SecurityConstants.FROM_IN);
+        if(booleanR.getStatus() != CommonConstants.SUCCESS || !booleanR.getData()){
+            throw new GlobalCustomerException(UserErrorTypeEnum.USER_LIMIT_ERROR.getDescription());
+        }
+
+        //发送个人消息
+        KxsUserMsg kxsUserMsg = MsgTemplateUtil.newUserPush(inviteUser.getId());
+        remoteUserMsgService.pushUserMsg(kxsUserMsg, SecurityConstants.FROM_IN);
+
+        //给商户添加创客标识,并把商户切换为商户型创客
+        KxsMerchant kxsMerchant = new KxsMerchant();
+        kxsMerchant.setId(registerDTO.getMchId());
+        kxsMerchant.setMakerUserId(kxsUser.getId());
+        R res = remoteKxsProductService.changeToMchUser(kxsMerchant, SecurityConstants.FROM_IN);
+
+        if(res.getStatus() != CommonConstants.SUCCESS){
+            throw new GlobalCustomerException(res.getMsg());
+        }
+
+        return R.ok();
+    }
+
     @Override
     public Boolean sendCode(String mobile) {
 
@@ -476,6 +557,7 @@ public class KxsUserServiceImpl extends ServiceImpl<KxsUserMapper, KxsUser> impl
     }
 
 
+
     @Override
     public R updatePwd(UserUpdatePwdDTO param) {