Browse Source

Merge branch 'dev' of http://git.aseanbusiness.cn/qzyReal/market-server into dev

qzyReal 2 năm trước cách đây
mục cha
commit
cab8167fe8
66 tập tin đã thay đổi với 3119 bổ sung345 xóa
  1. 22 3
      sp-core/sp-api/src/main/java/com/pj/api/client/level_one_server/LevelOneServerInterface.java
  2. 31 0
      sp-core/sp-api/src/main/java/com/pj/api/client/level_one_server/LevelOneServerInterfaceFallback.java
  3. 308 0
      sp-core/sp-api/src/main/java/com/pj/api/dto/GoodsDto.java
  4. 28 0
      sp-core/sp-base/pom.xml
  5. 114 0
      sp-core/sp-base/src/main/java/com/pj/aliyun/sms/AliyunInformSmsService.java
  6. 110 0
      sp-core/sp-base/src/main/java/com/pj/aliyun/sms/AliyunSmsService.java
  7. 56 0
      sp-core/sp-base/src/main/java/com/pj/common/core/utils/DateUtil.java
  8. 2 2
      sp-core/sp-base/src/main/java/com/pj/current/dto/APPLoginUserInfo.java
  9. 22 0
      sp-core/sp-base/src/main/java/com/pj/enummj/JudgeStatus.java
  10. 32 30
      sp-core/sp-base/src/main/java/com/pj/project4sp/uploadfile/UploadUtil.java
  11. 62 0
      sp-core/sp-base/src/main/java/com/pj/retry/SmsRetryService.java
  12. 26 1
      sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/MethodEnterpriseService.java
  13. 4 2
      sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseAppController.java
  14. 10 3
      sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseController.java
  15. 1 4
      sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseDto.java
  16. 44 16
      sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseService.java
  17. 51 0
      sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/param/EnterpriseParam.java
  18. 9 2
      sp-service/level-one-server/src/main/java/com/pj/tb_goods/TbGoodsController.java
  19. 9 0
      sp-service/level-one-server/src/main/java/com/pj/tb_goods/TbGoodsService.java
  20. 1 1
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_cart/TbGoodsCart.java
  21. 7 2
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_cart/TbGoodsCartService.java
  22. 34 3
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/GoodsTransitAppController.java
  23. 24 10
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/MethodGoodsTransitService.java
  24. 22 22
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitController.java
  25. 19 17
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitMapper.xml
  26. 41 37
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitService.java
  27. 70 25
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/param/TransactionGoodsParam.java
  28. 0 36
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/retry/SmsRetryService.java
  29. 6 6
      sp-service/level-one-server/src/main/java/com/pj/tb_goods_type/TbGoodsTypeController.java
  30. 8 1
      sp-service/level-one-server/src/main/java/com/pj/tb_group/TbGroupController.java
  31. 8 0
      sp-service/level-one-server/src/main/java/com/pj/tb_group/TbGroupService.java
  32. 60 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order/MethodOrderService.java
  33. 10 2
      sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrder.java
  34. 2 2
      sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderAppController.java
  35. 9 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderDto.java
  36. 109 109
      sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderMapper.xml
  37. 22 1
      sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderService.java
  38. 79 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirm.java
  39. 87 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmController.java
  40. 30 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmMapper.java
  41. 51 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmMapper.xml
  42. 51 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmService.java
  43. 27 0
      sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmUtil.java
  44. 8 0
      sp-service/level-one-server/src/main/java/com/pj/tb_people/TbPeopleAppController.java
  45. 15 1
      sp-service/level-one-server/src/main/java/com/pj/tb_people/TbPeopleController.java
  46. 85 3
      sp-service/level-one-server/src/main/java/com/pj/tb_people/TbPeopleService.java
  47. 103 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/AppTbDemandQuotationController.java
  48. 125 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotation.java
  49. 87 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationController.java
  50. 30 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationMapper.java
  51. 59 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationMapper.xml
  52. 117 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationService.java
  53. 27 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationUtil.java
  54. 30 0
      sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/param/DemandQuotationParam.java
  55. 96 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/AppTbGoodsDemandController.java
  56. 128 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/MethodGoodsDemandService.java
  57. 109 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemand.java
  58. 87 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandController.java
  59. 30 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandMapper.java
  60. 63 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandMapper.xml
  61. 109 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandService.java
  62. 27 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandUtil.java
  63. 61 0
      sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/vo/GoodsDemandVo.java
  64. 2 2
      sp-service/sp-admin/src/main/java/com/pj/project/app_user/AppUser.java
  65. 1 1
      sp-service/sp-admin/src/main/java/com/pj/project/app_user/AppUserService.java
  66. 2 1
      sp-service/transport-server/src/main/java/com/pj/project/tb_driver/TbDriverController.java

+ 22 - 3
sp-core/sp-api/src/main/java/com/pj/api/client/level_one_server/LevelOneServerInterface.java

@@ -3,11 +3,15 @@ package com.pj.api.client.level_one_server;
 import com.pj.api.FeignInterceptor;
 import com.pj.api.consts.FeignConsts;
 import com.pj.api.dto.EnterpriseDto;
+import com.pj.api.dto.GoodsDto;
 import com.pj.api.dto.GroupDto;
 import com.pj.api.dto.PeopleDto;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
 
 /**
  * @Author Mechrevo
@@ -20,15 +24,30 @@ import org.springframework.web.bind.annotation.RequestMapping;
 )
 public interface LevelOneServerInterface {
 
+    @RequestMapping("/TbPeople/rpc/getPeopleList")
+    public List<PeopleDto> getPeopleList(@RequestParam("groupId")Long groupId);
+
+    /** 查 - 根据id */
+    @RequestMapping("/TbGoods/rpc/getBygoodsId")
+    public GoodsDto getByGoodsId(@RequestParam("goodsId") Long goodsId);
+
+    /** 根据ID获取边民信息 */
+    @RequestMapping("/TbPeople/rpc/getRpcById")
+    public PeopleDto getRpcById(@RequestParam("id")Long peopleId);
+
+    /** 根据ID获取边民组信息 */
+    @RequestMapping("/TbGroup/rpc/getRpcById")
+    public GroupDto getRpcById(@RequestParam("id") String id);
+
     /** 添加商家身份信息 */
-    @RequestMapping("/TbEnterprise/enterpriseDto")
+    @RequestMapping("/TbEnterprise/rpc/enterpriseDto")
     public boolean enterpriseDto(@RequestBody EnterpriseDto enterpriseDto);
 
     /** 添加组长信息 */
-    @RequestMapping("/TbGroup/groupDto")
+    @RequestMapping("/TbGroup/rpc/groupDto")
     public boolean groupDto(@RequestBody GroupDto groupDto);
 
     /** 添加普通边民信息 */
-    @RequestMapping("/TbPeople/peopleDto")
+    @RequestMapping("/TbPeople/rpc/peopleDto")
     public boolean peopleDto(@RequestBody PeopleDto peopleDto);
 }

+ 31 - 0
sp-core/sp-api/src/main/java/com/pj/api/client/level_one_server/LevelOneServerInterfaceFallback.java

@@ -2,6 +2,7 @@ package com.pj.api.client.level_one_server;
 
 import com.pj.api.client.admin.AdminInterfaceFallback;
 import com.pj.api.dto.EnterpriseDto;
+import com.pj.api.dto.GoodsDto;
 import com.pj.api.dto.GroupDto;
 import com.pj.api.dto.PeopleDto;
 import feign.hystrix.FallbackFactory;
@@ -9,6 +10,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * @Author Mechrevo
  * @Date 2023 08 01 10 32
@@ -22,6 +25,34 @@ public class LevelOneServerInterfaceFallback implements FallbackFactory<LevelOne
     public LevelOneServerInterface create(Throwable throwable) {
         return new LevelOneServerInterface() {
             @Override
+            public List<PeopleDto> getPeopleList(Long groupId) {
+                System.out.println(throwable.getMessage());
+                log.error("根据groupId查询旗下所有边民错误:{},错误信息是{}",groupId,throwable.getMessage());
+                return null;
+            }
+
+            @Override
+            public GoodsDto getByGoodsId(Long goodsId) {
+                System.out.println(throwable.getMessage());
+                log.error("根据goodsId查询海关允许销售商品错误:{},错误信息是{}",goodsId,throwable.getMessage());
+                return null;
+            }
+
+            @Override
+            public PeopleDto getRpcById(Long peopleId) {
+                System.out.println(throwable.getMessage());
+                log.error("互市区组长需求报价错误:{},错误信息是{}",peopleId,throwable.getMessage());
+                return null;
+            }
+
+            @Override
+            public GroupDto getRpcById(String id) {
+                System.out.println(throwable.getMessage());
+                log.error("互市区组长错误:{},错误信息是{}",id,throwable.getMessage());
+                return null;
+            }
+
+            @Override
             public boolean enterpriseDto(EnterpriseDto enterpriseDto) {
                 System.out.println(throwable.getMessage());
                 log.error("互市区商家信息添加错误:{},错误信息是{}",enterpriseDto,throwable.getMessage());

+ 308 - 0
sp-core/sp-api/src/main/java/com/pj/api/dto/GoodsDto.java

@@ -0,0 +1,308 @@
+package com.pj.api.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 03 16 57
+ **/
+
+public class GoodsDto {
+
+    private Long id;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 主图
+     */
+    private String avatar;
+
+    /**
+     * 分类ID 字符串(可多选)
+     */
+    private String typeIds;
+
+    /**
+     * 分类名称
+     */
+    private String typeNames;
+
+    /**
+     * 编号
+     */
+    private String code;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 原产地
+     */
+    private String source;
+
+    /**
+     * 状态(0=禁用,1=启用)
+     */
+    private int status;
+
+
+
+    /**
+     *
+     */
+    private String unit;
+
+    /**
+     *
+     */
+    private Double singlePrice;
+
+    /**
+     *
+     */
+    private String taxNo;
+
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createTime;
+
+    /**
+     * 创建人编号
+     */
+    private String createBy;
+
+    /**
+     * 创建人名称
+     */
+    private String createName;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updateTime;
+
+    /**
+     * 更新人编号
+     */
+    private String updateBy;
+
+    /**
+     * 更新人名称
+     */
+    private String updateName;
+
+    /**
+     * 删除状态(0=禁用,1=启用)
+     */
+    private Integer deleteStatus;
+
+    public GoodsDto(String name, String avatar, String typeIds, String typeNames, String code, String remark, String source, int status, String unit, Double singlePrice, String taxNo, Date createTime, String createBy, String createName, Date updateTime, String updateBy, String updateName, Integer deleteStatus) {
+        this.name = name;
+        this.avatar = avatar;
+        this.typeIds = typeIds;
+        this.typeNames = typeNames;
+        this.code = code;
+        this.remark = remark;
+        this.source = source;
+        this.status = status;
+        this.unit = unit;
+        this.singlePrice = singlePrice;
+        this.taxNo = taxNo;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.createName = createName;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.updateName = updateName;
+        this.deleteStatus = deleteStatus;
+    }
+
+    public GoodsDto(Long id, String name, String avatar, String typeIds, String typeNames, String code, String remark, String source, int status, String unit, Double singlePrice, String taxNo, Date createTime, String createBy, String createName, Date updateTime, String updateBy, String updateName, Integer deleteStatus) {
+        this.id = id;
+        this.name = name;
+        this.avatar = avatar;
+        this.typeIds = typeIds;
+        this.typeNames = typeNames;
+        this.code = code;
+        this.remark = remark;
+        this.source = source;
+        this.status = status;
+        this.unit = unit;
+        this.singlePrice = singlePrice;
+        this.taxNo = taxNo;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.createName = createName;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.updateName = updateName;
+        this.deleteStatus = deleteStatus;
+    }
+
+    public GoodsDto() {
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getTypeIds() {
+        return typeIds;
+    }
+
+    public void setTypeIds(String typeIds) {
+        this.typeIds = typeIds;
+    }
+
+    public String getTypeNames() {
+        return typeNames;
+    }
+
+    public void setTypeNames(String typeNames) {
+        this.typeNames = typeNames;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public Double getSinglePrice() {
+        return singlePrice;
+    }
+
+    public void setSinglePrice(Double singlePrice) {
+        this.singlePrice = singlePrice;
+    }
+
+    public String getTaxNo() {
+        return taxNo;
+    }
+
+    public void setTaxNo(String taxNo) {
+        this.taxNo = taxNo;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    public String getCreateName() {
+        return createName;
+    }
+
+    public void setCreateName(String createName) {
+        this.createName = createName;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public String getUpdateName() {
+        return updateName;
+    }
+
+    public void setUpdateName(String updateName) {
+        this.updateName = updateName;
+    }
+
+    public Integer getDeleteStatus() {
+        return deleteStatus;
+    }
+
+    public void setDeleteStatus(Integer deleteStatus) {
+        this.deleteStatus = deleteStatus;
+    }
+}

+ 28 - 0
sp-core/sp-base/pom.xml

@@ -28,6 +28,34 @@
         </dependency>
 		<!-- ================= 模块依赖 end ================= -->
 
+
+
+        <!-- 阿里云短信服务 -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.16</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+
+
+        <!--人脸识别 阿里云 新版-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>facebody20191230</artifactId>
+            <version>3.0.7</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>ocr20191230</artifactId>
+            <version>1.0.26</version>
+        </dependency>
+
+
         <!-- 失败重试机制 spring-retry -->
         <dependency>
             <groupId>org.springframework.retry</groupId>

+ 114 - 0
sp-core/sp-base/src/main/java/com/pj/aliyun/sms/AliyunInformSmsService.java

@@ -0,0 +1,114 @@
+package com.pj.aliyun.sms;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import lombok.extern.log4j.Log4j2;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 阿里云通知短信
+ * @Author Mechrevo
+ * @Date 2023 08 04 09 47
+ **/
+@Slf4j
+public class AliyunInformSmsService {
+
+
+    // 签名
+    private static final String signName = "某某公司";
+
+    // 模板
+    private static final String templateCode = "SMS_22*****04";
+
+    // 阿里云短信配置信息
+    private static final String accessKeyId = "LTA*************9Cf";
+    private static final String accessKeySecret = "1GjBfyf*****************SDlP";
+    private static final String REGION_ID = "cn-hangzhou";
+    private static final String PRODUCT = "Dysmsapi";
+    private static final String DOMAIN = "dysmsapi.aliyuncs.com";
+
+    /**
+     * 发送短信通知
+     *
+     * @param mobile 手机号
+     * @return 执行结果
+     */
+    public static boolean sendSMS(String mobile) {
+        try {
+            IClientProfile profile = DefaultProfile.getProfile(REGION_ID, accessKeyId, accessKeySecret);
+
+            DefaultProfile.addEndpoint(REGION_ID, REGION_ID, PRODUCT, DOMAIN);
+
+            IAcsClient acsClient = new DefaultAcsClient(profile);
+
+            SendSmsRequest request = new SendSmsRequest();
+
+            request.setMethod(MethodType.POST);
+
+            // 手机号可以单个也可以多个(多个用逗号隔开,如:15*******13,13*******27,17*******56)
+            request.setPhoneNumbers(mobile);
+
+            request.setSignName(signName);
+
+            request.setTemplateCode(templateCode);
+
+            /*  例如签名内容为:某某公司
+            例如模板内容为:亲爱的同事,很高兴的通知您,您抽中了由领导${userName}派发的大饼奖励${money}元,请及时找财务领取!
+            变量属性:userName-其他;money-其他;
+            则短信内容为:【某某公司】 亲爱的同事,很高兴的通知您,您抽中了由领导${userName}派发的大饼奖励${money}元,请及时找财务领取!*/
+            request.setTemplateParam("{\"mobile\":\""+ mobile +"\",\"mobile\":\""+ mobile +"\"}");
+
+            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+            if ((sendSmsResponse.getCode() != null) && (sendSmsResponse.getCode().equals("OK"))) {
+                log.info("发送成功,code:" + sendSmsResponse.getCode());
+                return true;
+            } else {
+                log.info("发送失败,code:" + sendSmsResponse.getCode());
+                return false;
+            }
+        } catch (ClientException e) {
+            log.error("发送失败,系统错误!", e);
+            return false;
+        }
+    }
+
+    /**
+     * 获取逗号分隔的拼接字符串
+     *
+     * @param str 用于拼接的字符串集合
+     * @return String
+     */
+    public static String getSplitString(List<String> str) {
+        StringBuilder newS = new StringBuilder();
+        if (str != null && str.size() > 0) {
+            for (String s : str) {
+                newS.append(s).append(",");
+            }
+        }
+        if (newS.length() > 0)
+            newS.deleteCharAt(newS.length() - 1);// 删除最后一个多余的逗号
+        return newS.toString();
+    }
+
+    public static void main(String[] args) {
+//        多发
+//        List<String> mobiles = new ArrayList<>();
+//        mobiles.add("15*******13");
+//        mobiles.add("13*******27");
+//        mobiles.add("17*******56");
+//        String s= getSplitString(mobiles);
+//        System.out.println(AliyunInformSmsService.sendSMS(s, "大老鼠",  -2000L));
+//         单发
+        System.out.println(AliyunInformSmsService.sendSMS("177******56"));
+    }
+
+}

+ 110 - 0
sp-core/sp-base/src/main/java/com/pj/aliyun/sms/AliyunSmsService.java

@@ -0,0 +1,110 @@
+package com.pj.aliyun.sms;
+
+import com.alibaba.druid.support.json.JSONUtils;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.pj.common.core.utils.StringUtils;
+import com.pj.common.core.web.domain.AjaxResult;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 阿里云验证码短信
+ * Created on 17/6/7.
+ * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
+ * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
+ * 工程依赖了2个jar包(存放在工程的libs目录下)
+ * 1:aliyun-java-sdk-core.jar
+ * 2:aliyun-java-sdk-dysmsapi.jar
+ * <p>
+ * 备注:Demo工程编码采用UTF-8
+ * 国际短信发送请勿参照此DEMO
+ */
+public class AliyunSmsService {
+
+    //产品名称:云通信短信API产品,开发者无需替换
+    static final String product = "Dysmsapi";
+    //产品域名,开发者无需替换
+    static final String domain = "dysmsapi.aliyuncs.com";
+
+    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
+    static final String accessKeyId = "LTAI5t6cteYYRcJm8TdTZU8d";
+    static final String accessKeySecret = "nSED2HsrZbyhQM3ifGZmH0ruNaadLu";
+
+    /**
+     * @param phone        手机号
+     * @param SignName     短信签名
+     * @param TemplateCode 短信模板
+     * @param Param        模板内容
+     * @return
+     * @throws ClientException
+     */
+    public static boolean sendSms(String phone, String SignName, String TemplateCode, String Param) {
+
+        //可自助调整超时时间
+        SendSmsResponse response = null;
+        try {
+            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+            //初始化acsClient,暂不支持region化
+            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+            IAcsClient acsClient = new DefaultAcsClient(profile);
+
+            //组装请求对象-具体描述见控制台-文档部分内容
+            SendSmsRequest request = new SendSmsRequest();
+            //必填:待发送手机号
+            request.setPhoneNumbers(phone);
+            //必填:短信签名-可在短信控制台中找到
+            request.setSignName(SignName);
+            //必填:短信模板-可在短信控制台中找到
+            request.setTemplateCode(TemplateCode);
+            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+            request.setTemplateParam(Param);
+
+            //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
+            //request.setSmsUpExtendCode("90997");
+
+            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+            //request.setOutId("yourOutId");
+            //hint 此处可能会抛出异常,注意catch
+            response = acsClient.getAcsResponse(request);
+            System.out.println("发送短信:"+response.getMessage());
+        } catch (ClientException e) {
+            e.printStackTrace();
+            return false;
+        }
+        if (response.getCode() != null && response.getCode().equals("OK")) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 测试发送
+     * @param args
+     */
+    public static void main(String[] args) {
+        Map<String,Integer> param = new HashMap<>();
+        param.put("code", 10086);
+        boolean result = sendSms("18934859524", "一天实验室服务", "SMS_257813081", JSONUtils.toJSONString(param));
+        if (result) {
+//            redisCache.setCacheObject(CacheConstants.APP_CODE_KEY + user.getPhone(), code, 5, TimeUnit.MINUTES);
+            System.out.println("发送成功");
+        }
+    }
+
+}

+ 56 - 0
sp-core/sp-base/src/main/java/com/pj/common/core/utils/DateUtil.java

@@ -0,0 +1,56 @@
+package com.pj.common.core.utils;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import java.text.DateFormat;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 03 10 51
+ **/
+
+public class DateUtil {
+
+        public static ThreadLocal<DateFormat> chinaDateSDF = new ThreadLocal<DateFormat>() {
+
+            @Override
+            protected DateFormat initialValue() {
+                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
+                return df;
+
+            }
+        };
+
+        /**
+         * 获取日期yyyy-MM-dd格式字符串
+         *
+         * @param date
+         * @param locale
+         * @return
+         */
+        public static String dateToStr(Date date, Locale locale) {
+            if (locale == null) {
+
+            }
+            return chinaDateSDF.get().format(date);
+        }
+
+        /**
+         * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
+         *
+         * @param strDate
+         * @return
+         */
+        public static Date strToDateLong(String strDate) {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            ParsePosition pos = new ParsePosition(0);
+            Date strtodate = formatter.parse(strDate, pos);
+            return strtodate;
+        }
+
+
+}

+ 2 - 2
sp-core/sp-base/src/main/java/com/pj/current/dto/APPLoginUserInfo.java

@@ -11,6 +11,6 @@ import java.util.List;
 public class APPLoginUserInfo implements Serializable {
     private Long loginId;
     private String loginName;
-    private String fk;
-    private String userType;
+    private Long fk;
+    private Integer userType;
 }

+ 22 - 0
sp-core/sp-base/src/main/java/com/pj/enummj/JudgeStatus.java

@@ -0,0 +1,22 @@
+package com.pj.enummj;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 02 11 18
+ **/
+@Getter
+@AllArgsConstructor
+public enum JudgeStatus {
+
+    JUDGE_STATUS_ZERO(0,"待审核"),
+    JUDGE_STATUS_ONE(1,"审核通过"),
+    JUDGE_STATUS_THREE(2,"审核不通过");
+
+    private Integer code;
+
+    private String msg;
+
+}

+ 32 - 30
sp-core/sp-base/src/main/java/com/pj/project4sp/uploadfile/UploadUtil.java

@@ -25,39 +25,41 @@ public class UploadUtil {
 	public void setUploadConfig(UploadConfig uploadConfig) {
 		UploadUtil.uploadConfig = uploadConfig;
 	}
-	
+
 	/** 将文件名保存在服务器硬盘上,并把文件对应的http地址返回给前台  */
 	public static String saveFile(MultipartFile file, String flieTypeFolder) {
-		
-		// 1、计算路径  
-		// 根据日期计算需要保存的文件夹 
-		String currDateFolder = getCurrDateFolder();		
-		// 文件名 
-		String fileName = getMarking28() + '.' + getSuffixName(file.getOriginalFilename());				
-		// 需要保存到的文件夹地址 
+
+		// 1、计算路径
+		// 根据日期计算需要保存的文件夹
+		String currDateFolder = getCurrDateFolder();
+		// 文件名
+		String fileName = getMarking28() + '.' + getSuffixName(file.getOriginalFilename());
+		// 需要保存到的文件夹地址
 		String fileFolder = new File(uploadConfig.rootFolder).getAbsolutePath() + "/" +
-				uploadConfig.httpPrefix + flieTypeFolder + currDateFolder + "/";	
+				uploadConfig.httpPrefix + flieTypeFolder + currDateFolder + "/";
 		// 对外暴露的http路径
-		String httpUrl = getDoMain() + uploadConfig.httpPrefix + flieTypeFolder + currDateFolder + "/" + fileName;	
-		
-		// 2、如果文件夹不存在,则先创建 
+		//String httpUrl = getDoMain() + uploadConfig.httpPrefix + flieTypeFolder + currDateFolder + "/" + fileName;
+		//去掉前缀ip端口,从前台实时获取当前服务ip与端口
+		String httpUrl = uploadConfig.httpPrefix + flieTypeFolder + currDateFolder + "/" + fileName;
+
+		// 2、如果文件夹不存在,则先创建
 		File dirFile = new File(fileFolder);
 		if(dirFile.exists() == false) {
 			dirFile.mkdirs();
 		}
 
-		// 3、开始转存文件 
+		// 3、开始转存文件
 		try {
 			File outFile = new File(fileFolder + fileName);
-	        file.transferTo(outFile);		
+	        file.transferTo(outFile);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
-		
+
 		// 4、将文件外网地址返回给前台
 		return httpUrl;
 	}
-	
+
 	/** 验证文件大小  */
 	static void checkFileSize(MultipartFile file) {
 		// 文件大小(B)
@@ -66,22 +68,22 @@ public class UploadUtil {
         	throw new RuntimeException("文件大小超出限制");
         }
 	}
-	
-	/** 
-	 * 验证指定文件名是否存在于指定后缀列表中 
-	 * 参数:文件名、后缀列表	
-	 * case:checkSubffix("123.jpg", "jpg,png,gif")	验证通过  
+
+	/**
+	 * 验证指定文件名是否存在于指定后缀列表中
+	 * 参数:文件名、后缀列表
+	 * case:checkSubffix("123.jpg", "jpg,png,gif")	验证通过
 	 */
 	static void checkSubffix(String fileName, String suffixList) {
-		// 获取后缀,并转为小写 
-		String ext = getSuffixName(fileName).toLowerCase();	
-		// 去空格,加逗号   
-		String yxSuffix = suffixList.replace(" ", "") + ",";		
+		// 获取后缀,并转为小写
+		String ext = getSuffixName(fileName).toLowerCase();
+		// 去空格,加逗号
+		String yxSuffix = suffixList.replace(" ", "") + ",";
 		if(yxSuffix.indexOf(ext + ",") == -1) {
 			throw new RuntimeException("文件后缀验证未通过:" + ext);
 		}
 	}
-	
+
 	/** 返回随机生成的唯一标示28位唯一标示符 */
 	static String getMarking28() {
 		return System.currentTimeMillis() + "" + new Random().nextInt(Integer.MAX_VALUE);
@@ -91,16 +93,16 @@ public class UploadUtil {
 	static String getSuffixName(String fileName) {
 		return fileName.substring(fileName.lastIndexOf(".") + 1);
 	}
-	
+
 	/** 返回今天的日期文件夹  */
 	static String getCurrDateFolder() {
-		String currDateFolder = new SimpleDateFormat("/yyyy/MM-dd").format(new Date()); 
+		String currDateFolder = new SimpleDateFormat("/yyyy/MM-dd").format(new Date());
 		return currDateFolder;
 	}
-	
+
 	/** 返回本服务器域名信息  */
 	static String getDoMain() {
 		return SystemObject.config.getDomain();
 	}
-	
+
 }

+ 62 - 0
sp-core/sp-base/src/main/java/com/pj/retry/SmsRetryService.java

@@ -0,0 +1,62 @@
+package com.pj.retry;
+
+import com.pj.aliyun.sms.AliyunInformSmsService;
+import com.pj.aliyun.sms.AliyunSmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Recover;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 07 31 14 43
+ **/
+@Service
+@Slf4j
+public class SmsRetryService {
+
+
+    /**
+     * 验证码短信
+     * @param phone
+     * @param code
+     * @return
+     * @throws Exception
+     */
+    @Async
+    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
+    public boolean sendSmsCode(String phone,String code) throws Exception {
+        //模拟发送失败
+        //todo: 发送短信业务逻辑
+        boolean result = AliyunSmsService.sendSms("18934859524", "Mechrevo", "SMS_462415029", null);
+        if(!result) throw new Exception("模拟短信发送失败!");
+        return true;
+    }
+
+    /**
+     * 通知短信
+     * @param phone
+     * @return
+     * @throws Exception
+     */
+    @Async
+    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
+    public boolean sendSmsMsg(String phone) throws Exception {
+        System.out.println("\n发送通知短信!\n");
+        //todo: 发送短信业务逻辑
+        boolean result = AliyunInformSmsService.sendSMS("18934859524");
+        if(!result) throw new Exception("模拟短信发送失败!");
+        return true;
+    }
+
+
+    //最终补偿机制
+    @Recover
+    public void recover(){
+        log.error("发送短信失败!");
+    }
+
+}

+ 26 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/MethodEnterpriseService.java

@@ -1,9 +1,12 @@
 package com.pj.tb_enterprise;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.pj.api.client.admin.AdminInterface;
 import com.pj.api.client.transport.TransportInterface;
 import com.pj.api.dto.AppUserDto;
 import com.pj.api.dto.TbLogisticsDto;
+import com.pj.common.core.exception.ServiceException;
+import com.pj.enummj.DeleteStatus;
 import com.pj.tb_enterprise.vo.OrdersVo;
 import com.pj.tb_goods.TbGoods;
 import com.pj.tb_goods.TbGoodsMapper;
@@ -45,6 +48,8 @@ public class MethodEnterpriseService {
     private TransportInterface transportInterface;
     @Autowired
     private TbGoodsTransitMapper tbGoodsTransitMapper;
+    @Autowired
+    private TbEnterpriseMapper tbEnterpriseMapper;
 
     /**
      * 方法抽取:将List<TbOrder> tbOrderList 转成 List<OrderVo> vo
@@ -90,7 +95,7 @@ public class MethodEnterpriseService {
             //orderTime
             orderTime = item.getCreateTime();
             //orderStatus
-            orderStatus = item.getConfirm();
+            orderStatus = item.getFinishStatus();
             //物流对象
             TbLogisticsDto tbLogisticsDto = transportInterface.selectByOrderId(orderId);
             //数据封装
@@ -101,6 +106,26 @@ public class MethodEnterpriseService {
         return result;
     }
 
+    /**
+     * 验证重复提交
+     * @param loginUserFK 登录用户的ID
+     */
+    void againApply(Long loginUserFK){
+        List<TbEnterprise> enterpriseList = tbEnterpriseMapper.selectList(new LambdaQueryWrapper<TbEnterprise>().eq(TbEnterprise::getId, loginUserFK).eq(TbEnterprise::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode()));
+        if(enterpriseList.size() > 0){
+            switch (enterpriseList.get(0).getJudgeStatus()){
+                case 0:
+                    throw new RuntimeException("当前账号待审核!");
+                case 1:
+                    throw new RuntimeException("当前账号已审核通过!");
+                case 2:
+                    throw new RuntimeException("当前账号审核不通过!原因是: " + enterpriseList.get(0).getJudgeContent() + " 审核时间: " + enterpriseList.get(0).getJudgeTime());
+                default:
+                    throw new ServiceException("服务器繁忙~");
+            }
+        }
+
+    }
 
     /**
      * 方法抽取  导入

+ 4 - 2
sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseAppController.java

@@ -1,9 +1,11 @@
 package com.pj.tb_enterprise;
 
+import com.pj.tb_enterprise.param.EnterpriseParam;
 import com.pj.tb_enterprise.vo.OrdersVo;
 import com.pj.utils.sg.AjaxJson;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -39,8 +41,8 @@ public class TbEnterpriseAppController {
 
 	/** 商家认证 */
 	@RequestMapping("identification")
-	public AjaxJson identification(TbEnterprise t){
-		boolean identification = tbEnterpriseService.identification(t);
+	public AjaxJson identification(@Validated @RequestBody EnterpriseParam enterpriseParam){
+		boolean identification = tbEnterpriseService.identification(enterpriseParam);
 		if(!identification) return AjaxJson.getError("商家认证信息提交失败!!!");
 
 		return AjaxJson.getSuccess("商家认证信息已提交,管理员审核中,请耐心等待!");

+ 10 - 3
sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseController.java

@@ -84,11 +84,18 @@ public class TbEnterpriseController {
 		return AjaxJson.getSuccessData(t);
 	}
 
-	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	/** 查集合
+	 *  - 根据条件(参数为空时代表忽略指定条件)查看审核状态列表
+	 * @param judgeStatus 0=待审核 1=审核通过 2=审核不通过
+	 * @param keyword 模糊查询关键字,非必填,后期可进行聚合模糊查询
+	 * @return
+	 */
 	@RequestMapping("getList")
 		@SaCheckPermission(TbEnterprise.PERMISSION_CODE)
-	public AjaxJson getList() { 
+	public AjaxJson getList(Integer judgeStatus,@RequestParam(value = "keyword",required = false)String keyword) {
 		SoMap so = SoMap.getRequestSoMap();
+		so.set("judge_status",judgeStatus);
+		so.set("keyword",keyword);
 		List<TbEnterprise> list = tbEnterpriseService.getList(so.startPage());
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}
@@ -168,7 +175,7 @@ public class TbEnterpriseController {
 	/*------            正常业务👆👆    rpc远程调用👇👇                         -----------*/
 
 	/** 注册身份时对应的表添加数据 */
-	@RequestMapping("enterpriseDto")
+	@RequestMapping("rpc/enterpriseDto")
 	public boolean enterpriseDto(@RequestBody EnterpriseDto enterpriseDto){
 		boolean b = tbEnterpriseService.enterpriseDto(enterpriseDto);
 		return b;

+ 1 - 4
sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseDto.java

@@ -1,13 +1,10 @@
 package com.pj.tb_enterprise;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.fasterxml.jackson.annotation.JsonFormat;
+
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import java.util.Date;
 
 @Data
 @AllArgsConstructor

+ 44 - 16
sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/TbEnterpriseService.java

@@ -14,11 +14,14 @@ import com.alibaba.excel.event.AnalysisEventListener;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.pj.api.client.admin.AdminInterface;
 import com.pj.api.dto.EnterpriseDto;
+import com.pj.common.core.exception.ServiceException;
 import com.pj.current.dto.APPLoginUserInfo;
 import com.pj.current.satoken.StpAPPUserUtil;
 import com.pj.current.satoken.StpUserUtil;
 import com.pj.enummj.DeleteStatus;
+import com.pj.enummj.JudgeStatus;
 import com.pj.enummj.People;
+import com.pj.tb_enterprise.param.EnterpriseParam;
 import com.pj.tb_enterprise.vo.OrdersVo;
 import com.pj.tb_order.TbOrder;
 import com.pj.tb_order.TbOrderMapper;
@@ -128,34 +131,59 @@ public class TbEnterpriseService extends ServiceImpl<TbEnterpriseMapper, TbEnter
 		return line;
 	}
 
-	/** 商家认证 */
-	boolean identification(TbEnterprise enterprise){
-		if(null == enterprise) return false;
+	/**
+	 * 商家认证
+	 * @param enterpriseParam
+	 * @return
+	 */
+	boolean identification(EnterpriseParam enterpriseParam){
 
 		//手机号去重
-		String idCard = enterprise.getIdCard();
-		if(tbEnterpriseMapper.selectList(new LambdaQueryWrapper<TbEnterprise>().eq(TbEnterprise::getIdCard,idCard).eq(TbEnterprise::getDeleteStatus,1)).size() != 0)
+		String linkPhone = enterpriseParam.getLinkPhone();
+		if(tbEnterpriseMapper.selectList(new LambdaQueryWrapper<TbEnterprise>().eq(TbEnterprise::getIdCard,linkPhone).eq(TbEnterprise::getDeleteStatus,DeleteStatus.DELETE_STATUS_ON.getCode())).size() != 0)
 			throw new RuntimeException("当前手机号已被认证!");
 		//身份证号去重
-		String contact = enterprise.getContact();
-		if(tbEnterpriseMapper.selectList(new LambdaQueryWrapper<TbEnterprise>().eq(TbEnterprise::getContact,contact).eq(TbEnterprise::getDeleteStatus,1)).size() != 0)
+		String contact = enterpriseParam.getCorporateIdCard();
+		if(tbEnterpriseMapper.selectList(new LambdaQueryWrapper<TbEnterprise>().eq(TbEnterprise::getContact,contact).eq(TbEnterprise::getDeleteStatus,DeleteStatus.DELETE_STATUS_ON.getCode())).size() != 0)
 			throw new RuntimeException("当前身份证号已被认证!");
-
-		//是否需要手机发送验证码认证?
+		//判断是否重复提交
+		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
+		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
+			throw new RuntimeException("当前登录账号信息已失效!");
+		//重复提交验证
+		methodEnterpriseService.againApply(appLoginInfo.getFk());
+		//todo:是否需要手机发送验证码认证?
 
 		//开始保存商家信息
+		TbEnterprise tbEnterprise = new TbEnterprise();
+		//保存基本信息
+		tbEnterprise.setName(enterpriseParam.getName());
+		tbEnterprise.setNationality("China");
+		tbEnterprise.setLegalPerson(enterpriseParam.getCorporateName());
+		tbEnterprise.setIdCard(enterpriseParam.getCorporateIdCard());
+		tbEnterprise.setContact(enterpriseParam.getLinkPhone());
+		tbEnterprise.setBusinessLicense(enterpriseParam.getBusinessLicense());
+		tbEnterprise.setBankName(enterpriseParam.getBankName());
+		tbEnterprise.setBankAccount(enterpriseParam.getBankAccount());
+		tbEnterprise.setBankNo(enterpriseParam.getBankNo());
+		tbEnterprise.setDutyParagraph(enterpriseParam.getDutyParagraph());
+		//默认待审核
+		tbEnterprise.setJudgeStatus(JudgeStatus.JUDGE_STATUS_ZERO.getCode());
+
 		//注册/认证时间
-		enterprise.setRegisterTime(new Date());
+		tbEnterprise.setRegisterTime(new Date());
 		//创建时间
-		enterprise.setCreateTime(new Date());
+		tbEnterprise.setCreateTime(new Date());
 		//删除状态:启用
-		enterprise.setDeleteStatus(DeleteStatus.DELETE_STATUS_ON.getCode());
+		tbEnterprise.setDeleteStatus(DeleteStatus.DELETE_STATUS_ON.getCode());
 
 		// 保存商家信息
-		int insert = tbEnterpriseMapper.insert(enterprise);
+		int insert = tbEnterpriseMapper.insert(tbEnterprise);
 		return insert == 1;
 	}
 
+
+
 	/** 管理一级市场的贸易订单。
 	 * 列表(主要展示字段:订单号、下单时间、商品名称、图片、价格、购买的边民组、订单状态、物流信息)、
 	 * 确认退货/退款;
@@ -166,10 +194,10 @@ public class TbEnterpriseService extends ServiceImpl<TbEnterpriseMapper, TbEnter
 		//获取当前登录用户
 		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
 		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)throw new RuntimeException("当前登陆用户信息已失效!");
-		Long loginId = appLoginInfo.getLoginId();
+		Long fk = appLoginInfo.getFk();
 		//仅能查询自己的订单
-		so.set("buy_user_id",loginId);
-		so.set("delete_status",DeleteStatus.DELETE_STATUS_ON.getCode());
+		so.set("buyUserId",fk);
+		so.set("deleteStatus",DeleteStatus.DELETE_STATUS_ON.getCode());
 		so.set("keyword",keyword);
 
 		List<TbOrder> tbOrders = tbOrderMapper.getList(so);

+ 51 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_enterprise/param/EnterpriseParam.java

@@ -0,0 +1,51 @@
+package com.pj.tb_enterprise.param;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 商户认证入参
+ * @Author Mechrevo
+ * @Date 2023 08 02 10 56
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class EnterpriseParam {
+
+    @NotNull(message = "登录人ID")
+    private Long loginUserId;
+
+    @NotNull(message = "公司名称")
+    private String name;
+
+    @NotNull(message = "税号")
+    private String dutyParagraph;
+
+    @NotNull(message = "法人姓名")
+    private String corporateName;
+
+    @NotNull(message = "法人身份证")
+    private String corporateIdCard;
+
+    @NotNull(message = "联系号码")
+    private String linkPhone;
+
+    @NotNull(message = "银行编号")
+    private String bankNo;
+
+    @NotNull(message = "开户银行")
+    private String bankName;
+
+    @NotNull(message = "银行账号")
+    private String bankAccount;
+
+    @NotNull(message = "营业执照")
+    private String businessLicense;
+
+
+
+}

+ 9 - 2
sp-service/level-one-server/src/main/java/com/pj/tb_goods/TbGoodsController.java

@@ -2,6 +2,8 @@ package com.pj.tb_goods;
 
 import java.io.IOException;
 import java.util.List;
+
+import com.pj.api.dto.GoodsDto;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -122,8 +124,13 @@ public class TbGoodsController {
 	}
 
 
-
-
+/* ---           正常业务方法 👆👆  rpc远程调用👇👇                              ---*/
+	/** 查 - 根据id */
+	@RequestMapping("rpc/getBygoodsId")
+	public GoodsDto getByGoodsId(@RequestParam("goodsId") Long goodsId){
+		GoodsDto t = tbGoodsService.selectById(goodsId);
+		return t;
+	}
 
 
 

+ 9 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_goods/TbGoodsService.java

@@ -7,12 +7,14 @@ import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.pj.api.dto.GoodsDto;
 import com.pj.tb_enterprise.TbEnterprise;
 import com.pj.utils.so.SoMap;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -171,6 +173,13 @@ public class TbGoodsService extends ServiceImpl<TbGoodsMapper, TbGoods> implemen
 		return "数据导出完成!共导出 " + count + " 条数据。";
 	}
 
+	/** 远程调用 */
+	GoodsDto selectById(Long id){
+		TbGoods byId = super.getById(id);
+		GoodsDto goodsDto = new GoodsDto();
+		BeanUtils.copyProperties(byId,goodsDto);
+		return goodsDto;
 
+	}
 
 }

+ 1 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_goods_cart/TbGoodsCart.java

@@ -97,7 +97,7 @@ public class TbGoodsCart extends Model<TbGoodsCart> implements Serializable {
 	/**
 	 * 购买方式(2=互助组,3=个人购买) 
 	 */
-	private String buyType;	
+	private Integer buyType;
 
 	/**
 	 * 分配方式 

+ 7 - 2
sp-service/level-one-server/src/main/java/com/pj/tb_goods_cart/TbGoodsCartService.java

@@ -8,11 +8,14 @@ import com.pj.common.core.exception.ServiceException;
 import com.pj.current.dto.APPLoginUserInfo;
 import com.pj.current.satoken.StpAPPUserUtil;
 import com.pj.enummj.DeleteStatus;
+import com.pj.enummj.IsLock;
 import com.pj.tb_goods_cart.dto.GoodsCartInfoDto;
 import com.pj.tb_goods_transit.TbGoodsTransit;
 import com.pj.tb_goods_transit.TbGoodsTransitMapper;
 import com.pj.tb_group.TbGroup;
 import com.pj.tb_group.TbGroupMapper;
+import com.pj.tb_people.TbPeople;
+import com.pj.tb_people.TbPeopleMapper;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +42,8 @@ public class TbGoodsCartService extends ServiceImpl<TbGoodsCartMapper, TbGoodsCa
 	/** 已过审的商品 */
 	@Autowired
 	private TbGoodsTransitMapper tbGoodsTransitMapper;
+	@Autowired
+	private TbPeopleMapper tbPeopleMapper;
 	/** 增 */
 	void add(TbGoodsCart t){
 		save(t);
@@ -71,7 +76,7 @@ public class TbGoodsCartService extends ServiceImpl<TbGoodsCartMapper, TbGoodsCa
 		APPLoginUserInfo appUser = StpAPPUserUtil.getAPPLoginInfo();
 		if(appUser == null || appUser.getLoginId() == null)return AjaxJson.getError("购买者账号异常");
 		//判断当前用户是否为一级市场边民组长
-		int leader = tbGroupMapper.selectList(new LambdaQueryWrapper<TbGroup>().eq(TbGroup::getLeaderId, appUser.getLoginId())).size();
+		int leader = tbPeopleMapper.selectList(new LambdaQueryWrapper<TbPeople>().eq(TbPeople::getId, appUser.getFk()).eq(TbPeople::getIsLock, IsLock.IS_LOCK_ON.getCode()).eq(TbPeople::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode())).size();
 		if(leader == 0)throw new ServiceException("您当前的身份不是互市组组长,无法添加购物车!");
 		//购物车查重
 		int size = tbGoodsCartMapper.selectList(new LambdaQueryWrapper<TbGoodsCart>()
@@ -90,7 +95,7 @@ public class TbGoodsCartService extends ServiceImpl<TbGoodsCartMapper, TbGoodsCa
 		//购买的用户类型
 		tbGoodsCart.setBuyType(appUser.getUserType());
 		//购买方式,默认都是互助组进行购买
-		tbGoodsCart.setBuyType(2 + "");
+		tbGoodsCart.setBuyType(2);
 		//购买商品的重量
 		tbGoodsCart.setBuyWeight(goodsCartInfoDto.getBuyWeight());
 		//当前商品的单位

+ 34 - 3
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/GoodsTransitAppController.java

@@ -3,6 +3,7 @@ package com.pj.tb_goods_transit;
 
 import com.pj.current.dto.APPLoginUserInfo;
 import com.pj.current.satoken.StpAPPUserUtil;
+import com.pj.enummj.DeleteStatus;
 import com.pj.tb_goods_transit.param.PurchaseLevelOneGoodsTransitParam;
 import com.pj.tb_goods_transit.param.TransactionGoodsParam;
 import com.pj.utils.sg.AjaxJson;
@@ -28,6 +29,14 @@ public class GoodsTransitAppController {
     @Autowired
     private TbGoodsTransitService tbGoodsTransitService;
 
+    /** 查 - 根据id */
+    @RequestMapping("getById")
+//		@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE)
+    public AjaxJson getById(Long id){
+        TbGoodsTransit t = tbGoodsTransitService.getById(id);
+        return AjaxJson.getSuccessData(t);
+    }
+
     /** 查集合 - 根据APP用户ID查发布的商品(参数为空时代表忽略指定条件) */
     @RequestMapping("getTransitList")
 //		@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE)
@@ -37,15 +46,32 @@ public class GoodsTransitAppController {
         if(appLoginInfo == null)throw new RuntimeException("当前登陆用户信息已失效!");
 
         SoMap so = SoMap.getRequestSoMap();
-        so.put("merchantId",appLoginInfo.getLoginId());
+        so.put("merchantId",appLoginInfo.getFk());
+        so.put("deleteStatus" , DeleteStatus.DELETE_STATUS_ON.getCode());
         List<TbGoodsTransit> list = tbGoodsTransitService.getList(so.startPage());
         return AjaxJson.getPageData(so.getDataCount(), list);
     }
 
+    /** 删 */
+    @RequestMapping("deleteById")
+//	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_DEL)
+    public AjaxJson deleteById(Long id){
+        tbGoodsTransitService.delete(id);
+        return AjaxJson.getSuccess();
+    }
+
+    /** 改 */
+    @RequestMapping("update")
+//	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_EDIT)
+    public AjaxJson update(TbGoodsTransit t){
+        tbGoodsTransitService.update(t);
+        return AjaxJson.getSuccess();
+    }
+
     /** app端用户添加商品 */
     @RequestMapping("transactionGoods")
 //    @SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_ADD)
-    public AjaxJson transactionGoods(@Validated @RequestBody TransactionGoodsParam t){
+    public AjaxJson transactionGoods(TransactionGoodsParam t){
         boolean goods = tbGoodsTransitService.transactionGoods(t);
         if(goods) return AjaxJson.getSuccess("商品添加成功!");
         return AjaxJson.getError("商品添加失败!");
@@ -70,7 +96,12 @@ public class GoodsTransitAppController {
 
 
 
-    /** app端 商户确认订单*/
+    /**
+     * 采购一级市场的商品,
+     * 包括加入购物车、购买、支付(暂时不做),
+     * 下单后会向组内边民发送短信,
+     * 通知其登录APP进行交易确认。
+     */
     @RequestMapping("purchaseLevelOntGoodsTransit")
 //    @SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_ADD)
     public AjaxJson purchaseLevelOntGoodsTransit(@Validated @RequestBody PurchaseLevelOneGoodsTransitParam purchaseLevelOneGoodsTransitParam) throws Exception {

+ 24 - 10
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/MethodGoodsTransitService.java

@@ -1,10 +1,13 @@
 package com.pj.tb_goods_transit;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.pj.current.dto.APPLoginUserInfo;
 import com.pj.enummj.*;
-import com.pj.tb_goods_transit.retry.SmsRetryService;
+import com.pj.retry.SmsRetryService;
 import com.pj.tb_order.TbOrder;
+import com.pj.tb_order.TbOrderMapper;
 import com.pj.tb_people.TbPeople;
+import com.pj.tb_people.TbPeopleMapper;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
@@ -14,9 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -36,7 +37,10 @@ public class MethodGoodsTransitService {
     /** 短信运营商 */
     @Autowired
     private SmsRetryService smsRetryService;
-    //todo:
+    @Autowired
+    private TbOrderMapper tbOrderMapper;
+    @Autowired
+    private TbPeopleMapper tbPeopleMapper;
 
 
 
@@ -44,7 +48,9 @@ public class MethodGoodsTransitService {
      * 给边民组组员发送短信通知
      */
     public int sendSms(List<TbPeople> peopleIdList) {
-
+        Map<String,Object> param = new HashMap<>();
+        param.put("msg","您的组长已下单,请前往app进行确认!");
+//        AliyunSmsService.sendSms("18934859524", "边民互市","SMS_462415029",JSONUtils.toJSONString(param));
         //获取当前电脑核心数
         int processors = Runtime.getRuntime().availableProcessors() / 2;
         //创建固定线程
@@ -66,7 +72,7 @@ public class MethodGoodsTransitService {
                 enterpriseList.forEach(item -> {
                     //todo: 给边民发送短信,调用短信商接口API
                     try {
-                        smsRetryService.sendSms(item.getPhone(), item.getCode().equals("null")? "666666" :item.getCode());
+                        smsRetryService.sendSmsCode(item.getPhone(), "666");
                     } catch (Exception e) {
                         System.out.println("异常被抓住了!");
                         throw new RuntimeException(e);
@@ -94,13 +100,16 @@ public class MethodGoodsTransitService {
     public TbOrder setTbOrderProperties(TbGoodsTransit tbGoodsTransit, APPLoginUserInfo appLoginInfo){
         //执行采购,创建一级市场订单表
         TbOrder tbOrder = new TbOrder();
+        List<TbPeople> tbPeopleList = tbPeopleMapper.selectList(new LambdaQueryWrapper<TbPeople>().eq(TbPeople::getId, appLoginInfo.getFk()).eq(TbPeople::getIsLock,IsLock.IS_LOCK_ON.getCode()).eq(TbPeople::getDeleteStatus,DeleteStatus.DELETE_STATUS_ON.getCode()));
+        if(tbPeopleList.size() != 1)throw new RuntimeException("当前用户信息有误!");
         //设置属性
+        tbOrder.setGroupId(tbPeopleList.get(0).getGroupId());
         tbOrder.setTradeAreaId(tbGoodsTransit.getTradeAreaId());
         tbOrder.setTradeAreaName(tbGoodsTransit.getTradeAreaName());
         tbOrder.setGoodsId(tbGoodsTransit.getId());
         tbOrder.setSaleMainId(Long.valueOf(tbGoodsTransit.getMerchantId()));
-//		tbOrder.setTradeNo();  // 建议编号
-        tbOrder.setBuyUserId(appLoginInfo.getLoginId());
+//		tbOrder.setTradeNo();  // 交易编号
+        tbOrder.setBuyUserId(tbPeopleList.get(0).getId());
         tbOrder.setBuyUserType(2 + "");
         tbOrder.setBuyUserName(appLoginInfo.getLoginName());
         tbOrder.setEnterpriseId(Long.valueOf(tbGoodsTransit.getMerchantId()));
@@ -119,7 +128,8 @@ public class MethodGoodsTransitService {
         tbOrder.setShopName(tbGoodsTransit.getShopName());
         //设置下单时的默认状态
         tbOrder.setDeleteStatus(DeleteStatus.DELETE_STATUS_ON.getCode()); // 删除状态默认是1,可用
-        tbOrder.setConfirm(EnterpriseConfirm.ENTERPRISE_CONFIRM_ZERO.getCode()); // 0为待商家确认
+        tbOrder.setEnterpriseConfirm(EnterpriseConfirm.ENTERPRISE_CONFIRM_ZERO.getCode()); // 0为待商家确认
+        tbOrder.setPeopleConfirm(EnterpriseConfirm.ENTERPRISE_CONFIRM_ZERO.getCode()); // 0为待边民确认
         tbOrder.setSend(DeliverStatus.DELIVER_STATUS_ZERO.getCode());  // 0为未发货 1为已发货
         tbOrder.setTradeStatus(TradeStatus.TRADE_STATUS_ZERO.getCode().toString()); //支付状态默认是0,未支付
         tbOrder.setResaleStatus(ResaleStatus.RESALE_STATUS_ZERO.getCode()); // 是否转售状态,默认未转售 0
@@ -128,6 +138,10 @@ public class MethodGoodsTransitService {
         tbOrder.setCreateBy(appLoginInfo.getLoginId());
         tbOrder.setCreateName(appLoginInfo.getLoginName());
         tbOrder.setCreateTime(new Date());
+        //		//查询是否已存在该订单
+        List<TbOrder> tbOrderList = tbOrderMapper.selectList(new LambdaQueryWrapper<TbOrder>().eq(TbOrder::getGoodsId, tbGoodsTransit.getId()).eq(TbOrder::getDeleteStatus,DeleteStatus.DELETE_STATUS_ON.getCode()));
+        if(tbOrderList.size() != 0)throw new RuntimeException("当前商品已存在订单,暂时无法继续下单!");
+
         return tbOrder;
     }
 

+ 22 - 22
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitController.java

@@ -19,7 +19,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 /**
  * Controller: tb_goods_transit -- 审核商户在APP端发布的商品
- * @author qzy 
+ * @author qzy
  */
 @RestController
 @RequestMapping("/TbGoodsTransit/")
@@ -29,7 +29,7 @@ public class TbGoodsTransitController {
 	@Autowired
 	TbGoodsTransitService tbGoodsTransitService;
 
-	/** 增 */  
+	/** 增 */
 	@RequestMapping("add")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_ADD)
 	public AjaxJson add(TbGoodsTransit t){
@@ -38,24 +38,24 @@ public class TbGoodsTransitController {
 		return AjaxJson.getSuccessData(t);
 	}
 
-	/** 删 */  
+	/** 删 */
 	@RequestMapping("delete")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_DEL)
 	public AjaxJson delete(Long id){
 		 tbGoodsTransitService.delete(id);
 		return AjaxJson.getSuccess();
 	}
-	
-	/** 删 - 根据id列表 */  
+
+	/** 删 - 根据id列表 */
 	@RequestMapping("deleteByIds")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_DEL)
 	public AjaxJson deleteByIds(){
-		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class);
 		int line = SP.publicMapper.deleteByIds(TbGoodsTransit.TABLE_NAME, ids);
 		return AjaxJson.getByLine(line);
 	}
-	
-	/** 改 */  
+
+	/** 改 */
 	@RequestMapping("update")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_EDIT)
 	public AjaxJson update(TbGoodsTransit t){
@@ -63,7 +63,7 @@ public class TbGoodsTransitController {
 		return AjaxJson.getSuccess();
 	}
 
-	/** 查 - 根据id */  
+	/** 查 - 根据id */
 	@RequestMapping("getById")
 //		@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE)
 	public AjaxJson getById(Long id){
@@ -71,38 +71,38 @@ public class TbGoodsTransitController {
 		return AjaxJson.getSuccessData(t);
 	}
 
-	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */
 	@RequestMapping("getList")
 //		@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE)
-	public AjaxJson getList() { 
+	public AjaxJson getList() {
 		SoMap so = SoMap.getRequestSoMap();
 		List<TbGoodsTransit> list = tbGoodsTransitService.getList(so.startPage());
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}
-	
-	
-	
-	/** 改 - 商品状态(0=下架,1=在售) */  
+
+
+
+	/** 改 - 商品状态(0=下架,1=在售) */
 	@RequestMapping("updateGoodsStatus")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_EDIT)
 	public AjaxJson updateGoodsStatus(Long id, Integer value){
 		int line = SP.publicMapper.updateColumnById(TbGoodsTransit.TABLE_NAME, "goods_status", value, id);
 		return AjaxJson.getByLine(line);
 	}
-	
-	/** 改 - 审核状态(0=待审核,1=通过,2=不通过) */  
+
+	/** 改 - 审核状态(0=待审核,1=通过,2=不通过) */
 	@RequestMapping("updateAuditStatus")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_EDIT)
 	public AjaxJson updateAuditStatus(Long id, Integer value){
 		int line = SP.publicMapper.updateColumnById(TbGoodsTransit.TABLE_NAME, "audit_status", value, id);
 		return AjaxJson.getByLine(line);
 	}
-	
-	/** 改 - 删除状态(0=禁用,1=启用) */  
+
+	/** 改 - 删除状态(0=禁用,1=启用) */
 	@RequestMapping("updateDelStatus")
 //	@SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_EDIT)
 	public AjaxJson updateDelStatus(Long id, Integer value){
-		int line = SP.publicMapper.updateColumnById(TbGoodsTransit.TABLE_NAME, "del_status", value, id);
+		int line = SP.publicMapper.updateColumnById(TbGoodsTransit.TABLE_NAME, "delete_status", value, id);
 		return AjaxJson.getByLine(line);
 	}
 
@@ -157,7 +157,7 @@ public class TbGoodsTransitController {
 		}
 		return AjaxJson.getError();
 	}
-	
-	
+
+
 
 }

+ 19 - 17
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitMapper.xml

@@ -6,18 +6,18 @@
 
 
 	<!-- ================================== 查询相关 ================================== -->
-	<!-- select id, merchant_id, merchant_name, goods_type, goods_name, goods_units, price, place_origin, discription, stock, goods_status, audit_status, audit_time, remark, create_time, create_by, create_name, update_time, update_by, update_name, del_status from tb_goods_transit  -->
-	
+	<!-- select id, merchant_id, merchant_name, goods_type, goods_name, goods_units, price, place_origin, discription, stock, goods_status, audit_status, audit_time, remark, create_time, create_by, create_name, update_time, update_by, update_name, delete_status from tb_goods_transit  -->
+
 	<!-- 通用映射:自动模式 -->
 	<resultMap id="model" autoMapping="true" type="com.pj.tb_goods_transit.TbGoodsTransit"></resultMap>
-	
+
 	<!-- 公共查询sql片段 -->
 	<sql id="select_sql">
-		select * 
-		from tb_goods_transit 
+		select *
+		from tb_goods_transit
 	</sql>
 
-	
+
 	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
 	<select id="getList" resultMap="model">
 		<include refid="select_sql"></include>
@@ -33,6 +33,8 @@
 			<if test=' this.has("description") '> and discription = #{discription} </if>
 			<if test=' this.has("stock") '> and stock = #{stock} </if>
 			<if test=' this.has("goodsStatus") '> and goods_status = #{goodsStatus} </if>
+			<if test=' this.has("isOrders") '> and is_orders = #{isOrders} </if>
+			<if test=' this.has("enterpriseConfirm") '> and enterprise_confirm = #{enterpriseConfirm} </if>
 			<if test=' this.has("auditStatus") '> and audit_status = #{auditStatus} </if>
 			<if test=' this.has("auditTime") '> and audit_time = #{auditTime} </if>
 			<if test=' this.has("remark") '> and remark = #{remark} </if>
@@ -42,7 +44,7 @@
 			<if test=' this.has("updateTime") '> and update_time = #{updateTime} </if>
 			<if test=' this.has("updateBy") '> and update_by = #{updateBy} </if>
 			<if test=' this.has("updateName") '> and update_name = #{updateName} </if>
-			<if test=' this.has("deleteStatus") '> and del_status = #{delStatus} </if>
+			<if test=' this.has("deleteStatus") '> and delete_status = #{deleteStatus} </if>
 		</where>
 		order by
 		<choose>
@@ -66,18 +68,18 @@
 			<when test='sortType == 18'> update_time desc </when>
 			<when test='sortType == 19'> update_by desc </when>
 			<when test='sortType == 20'> update_name desc </when>
-			<when test='sortType == 21'> del_status desc </when>
+			<when test='sortType == 21'> delete_status desc </when>
 			<otherwise> id desc </otherwise>
 		</choose>
 	</select>
-	
-	
-	
-	
-	
-	
-	
-	
-	
+
+
+
+
+
+
+
+
+
 
 </mapper>

+ 41 - 37
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitService.java

@@ -8,10 +8,15 @@ import java.util.Date;
 import java.util.List;
 
 import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.druid.support.json.JSONUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.pj.aliyun.sms.AliyunSmsService;
 import com.pj.current.dto.APPLoginUserInfo;
 import com.pj.current.satoken.StpAPPUserUtil;
 import com.pj.enummj.*;
+import com.pj.retry.SmsRetryService;
+import com.pj.tb_enterprise.TbEnterprise;
+import com.pj.tb_enterprise.TbEnterpriseMapper;
 import com.pj.tb_goods.TbGoods;
 import com.pj.tb_goods.TbGoodsMapper;
 import com.pj.tb_goods_transit.param.JudgeTransitParam;
@@ -42,7 +47,7 @@ import javax.swing.filechooser.FileSystemView;
 
 /**
  * Service: tb_goods_transit -- 审核商户在APP端发布的商品
- * @author qzy 
+ * @author qzy
  */
 @Service
 @Transactional(rollbackFor = Exception.class)
@@ -58,7 +63,7 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 	@Autowired
 	private TbGoodsMapper tbGoodsMapper;
 	@Autowired
-	private TbGroupMapper tbGroupMapper;
+	private SmsRetryService smsRetryService;
 	/** 互市区mapper */
 	@Autowired
 	private TbTradeAreaMapper tbTradeAreaMapper;
@@ -69,6 +74,9 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 	@Autowired
 	private TbPeopleMapper tbPeopleMapper;
 
+	@Autowired
+	private TbEnterpriseMapper tbEnterpriseMapper;
+
 	/** 增 */
 	void add(TbGoodsTransit t){
 		save(t);
@@ -90,9 +98,9 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 		return super.getById(id);
 	}
 
-	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
-	List<TbGoodsTransit> getList(SoMap so) { 
-		return tbGoodsTransitMapper.getList(so);	
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */
+	List<TbGoodsTransit> getList(SoMap so) {
+		return tbGoodsTransitMapper.getList(so);
 	}
 
 	/** 查看一级市场在销/上架商品 */
@@ -174,11 +182,19 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 		tbGoodsTransit.setGoodsType(tbGoods.getTypeNames());
 		tbGoodsTransit.setShopId(transactionGoodsParam.getShopId());
 		tbGoodsTransit.setShopName(transactionGoodsParam.getShopName());
+
+		//商户编号
+		tbGoodsTransit.setMerchantId(appLoginInfo.getLoginId() + "");
+		//商户名称
+		tbGoodsTransit.setMerchantName(appLoginInfo.getLoginName());
+
 		//保存海关商品表的主键到商品审核表上 todo:原计划是保存[海关申报单号],临时修改成保存海关商品表的主键
 		tbGoodsTransit.setDeclareOdd(tbGoods.getId().toString());
 		//设置默认信息
 		tbGoodsTransit.setAuditStatus(1);//默认已过审
 		tbGoodsTransit.setGoodsStatus(1);//默认已上架
+		tbGoodsTransit.setIsOrders(0);//默认未被下单
+		tbGoodsTransit.setEnterpriseConfirm(0);//商铺确认情况[0=待确认,1=已确认,2=拒绝]
 		//设置基本信息
 		tbGoodsTransit.setCreateTime(new Date());
 		tbGoodsTransit.setCreateBy(appLoginInfo.getLoginId() + "");
@@ -206,7 +222,7 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 						tbGoodsTransit.getGoodsStatus() : goodsStatus);
 		//设置基本属性
 		tbGoodsTransit.setUpdateTime(new Date());
-		tbGoodsTransit.setUpdateBy(appLoginInfo.getLoginId() + "");
+		tbGoodsTransit.setUpdateBy(appLoginInfo.getLoginId().toString());
 		tbGoodsTransit.setUpdateName(appLoginInfo.getLoginName());
 		//执行保存
 		int updateById = tbGoodsTransitMapper.updateById(tbGoodsTransit);
@@ -228,10 +244,11 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
 			throw new RuntimeException("当前登陆用户信息已失效!");
 		//判断当前登陆人是否为互市组组长
-		List<TbGroup> list = tbGroupMapper.selectList
-				(new LambdaQueryWrapper<TbGroup>().eq(TbGroup::getLeaderId, appLoginInfo.getLoginId())
-						.eq(TbGroup::getIsLock, IsLock.IS_LOCK_ON.getCode())
-						.eq(TbGroup::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode()));
+		List<TbPeople> list = tbPeopleMapper.selectList
+				(new LambdaQueryWrapper<TbPeople>().eq(TbPeople::getId,appLoginInfo.getFk())
+						.eq(TbPeople::getRole, 2) // 1 边民 2组长
+						.eq(TbPeople::getIsLock, IsLock.IS_LOCK_ON.getCode())
+						.eq(TbPeople::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode()));
 		if(list.size() != 1)throw new RuntimeException("您当前不属于互市组组长~");
 		//获取商品ID
 		String goodsTransitId = purchaseLevelOntGoodsTransitParam.getGoodsTransitId();
@@ -242,42 +259,29 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 		//检查是否属于海关允许销售商品
 		String declareOdd = tbGoodsTransit.getDeclareOdd();
 		TbGoods tbGoods = tbGoodsMapper.selectById(declareOdd);
-		if(tbGoods == null)throw new RuntimeException("当前商品海关不允许销售!");
+		if(tbGoods == null)throw new RuntimeException("当前商品海关不允许销售!");
 		//执行采购,创建一级市场订单表 , 该方法只是设置tbOrder的属性
 		TbOrder tbOrder = methodGoodsTransitService.setTbOrderProperties(tbGoodsTransit, appLoginInfo);
-
-//		//查询是否已存在该订单
-		List<TbOrder> tbOrderList = tbOrderMapper.selectList(new LambdaQueryWrapper<TbOrder>().eq(TbOrder::getGoodsId, tbGoodsTransit.getId()).eq(TbOrder::getDeleteStatus,DeleteStatus.DELETE_STATUS_ON.getCode()));
-		if(tbOrderList.size() != 0)throw new RuntimeException("当前商品已存在订单,暂时无法继续下单!");
-
 		//执行保存 创建订单
 		int insert = tbOrderMapper.insert(tbOrder);
 		if(insert == 1){
-			// todo: 执行订单完成后的逻辑
-			// todo: 发送短信给边民组通知其确认
-			//获取互市组ID
-			Long groupId = list.get(0).getId();
-			if(groupId == null)throw new RuntimeException("订单异常,原因是没有关联的边民!");
-			//通过互市组ID查询所属边民的ID集合
-			List<TbPeople> tbPeopleList = tbPeopleMapper.selectList
-					(new LambdaQueryWrapper<TbPeople>()
-							.eq(TbPeople::getGroupId, groupId)
-							.eq(TbPeople::getIsLock, IsLock.IS_LOCK_ON.getCode())
-							.eq(TbPeople::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode()));
-
-			if(tbPeopleList.size() == 0)throw new RuntimeException("订单异常,原因是没有关联的边民!!!");
-			int sendSmsCounts = methodGoodsTransitService.sendSms(tbPeopleList);
-			if(sendSmsCounts != tbPeopleList.size()){
-				//todo: 如果短信发送成功次数 与 边民数不一致处理
-
+			//将商品信息改成已被下单
+			tbGoodsTransit.setIsOrders(1);
+			int updateById = tbGoodsTransitMapper.updateById(tbGoodsTransit);
+			//执行给商家发送信息
+			if(updateById == 1){
+				//获取商家信息
+				TbEnterprise tbEnterprise = tbEnterpriseMapper.selectById(tbGoodsTransit.getMerchantId());
+				if(tbEnterprise == null)throw new RuntimeException("商家不存在!");
+				//todo: 线上时放开下面的参数 - 通知短信
+				return smsRetryService.sendSmsMsg("18934859524");
+//				("18934859524", "一天实验室服务", "SMS_257813081", JSONUtils.toJSONString("修改内容"));
 			}
-
-
 		}
-
-		return true;
+		throw new RuntimeException("订单预创建异常!");
 	}
 
+
 	/**
 	 * 导入
 	 * @param file excel文件

+ 70 - 25
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/param/TransactionGoodsParam.java

@@ -16,25 +16,6 @@ import javax.validation.constraints.NotNull;
 @NoArgsConstructor
 public class TransactionGoodsParam {
 
-    /** 海关申报单号 */
-    private String declareOdd;
-
-    /** 互市区ID */
-    @NotNull
-    private Long tradeAreaId;
-
-    /** 价格 */
-    private Double price;
-
-    /** 净重 */
-    private Double netWeight;
-
-    /** 毛重 */
-    private Double grossWeight;
-
-    /** 数量 */
-    private Integer stock;
-
     /** 监管商品的ID */
     @NotBlank(message = "监管商品ID不能为空")
     private Long id;
@@ -45,12 +26,6 @@ public class TransactionGoodsParam {
     /** 当前添加商品的商户名称 */
     private String merchantName;
 
-    /** 商品描述 */
-    private String description;
-
-    /** 商品图片 */
-    private String goodsImg;
-
     /** 商铺id */
     @NotBlank(message = "商铺ID不能为空")
     private Long shopId;
@@ -58,4 +33,74 @@ public class TransactionGoodsParam {
     /** 商铺名称 */
     private String shopName;
 
+    /** 互市区名称 */
+    private String tradeAreaName;
+
+    /** 互市区ID */
+    private Long tradeAreaId;
+
+    /**
+     * 海关申报单号
+     */
+    private String declareOdd;
+
+    /**
+     * 商品类型
+     */
+    private String goodsType;
+    /**
+     * 商品图片
+     */
+    private String goodsImg;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 商品单位(吨、kg、个、柜)
+     */
+    private String goodsUnits;
+
+    /**
+     * 净重
+     */
+    private Double netWeight;
+
+    /**
+     * 毛重
+     */
+    private Double grossWeight;
+
+    /**
+     * 商品价格
+     */
+    private Double price;
+
+    /**
+     * 产地(国家)
+     */
+    private String placeOrigin;
+
+    /**
+     * 商品描述
+     */
+    private String description;
+
+    /**
+     * 库存数量
+     */
+    private Integer stock;
+
+    /**
+     * 商品状态(0=下架,1=在售)
+     */
+    private Integer goodsStatus;
+
+
+
+
+
+
 }

+ 0 - 36
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/retry/SmsRetryService.java

@@ -1,36 +0,0 @@
-package com.pj.tb_goods_transit.retry;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.retry.annotation.Backoff;
-import org.springframework.retry.annotation.Recover;
-import org.springframework.retry.annotation.Retryable;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-
-import java.util.logging.Logger;
-
-/**
- * @Author Mechrevo
- * @Date 2023 07 31 14 43
- **/
-@Service
-@Slf4j
-public class SmsRetryService {
-
-
-    @Async
-    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
-    public boolean sendSms(String phone,String code) throws Exception {
-        //模拟发送失败
-        //todo: 发送短信业务逻辑
-        throw new Exception("模拟短信发送失败!");
-    }
-
-
-    //最终补偿机制
-    @Recover
-    public void recover(){
-        log.error("发送短信失败!");
-    }
-
-}

+ 6 - 6
sp-service/level-one-server/src/main/java/com/pj/tb_goods_type/TbGoodsTypeController.java

@@ -25,7 +25,7 @@ public class TbGoodsTypeController {
 
 	/** 增 */  
 	@RequestMapping("add")
-	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_ADD)
+//	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_ADD)
 	public AjaxJson add(TbGoodsType t){
 		tbGoodsTypeService.add(t);
 		t = tbGoodsTypeService.getById(SP.publicMapper.getPrimarykey());
@@ -34,7 +34,7 @@ public class TbGoodsTypeController {
 
 	/** 删 */  
 	@RequestMapping("delete")
-	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_DEL)
+//	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_DEL)
 	public AjaxJson delete(String id){
 		 tbGoodsTypeService.delete(Long.valueOf(id));
 		return AjaxJson.getSuccess();
@@ -42,7 +42,7 @@ public class TbGoodsTypeController {
 	
 	/** 删 - 根据id列表 */  
 	@RequestMapping("deleteByIds")
-	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_DEL)
+//	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_DEL)
 	public AjaxJson deleteByIds(){
 		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
 		int line = SP.publicMapper.deleteByIds(TbGoodsType.TABLE_NAME, ids);
@@ -51,7 +51,7 @@ public class TbGoodsTypeController {
 	
 	/** 改 */  
 	@RequestMapping("update")
-	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_EDIT)
+//	@SaCheckPermission(TbGoodsType.PERMISSION_CODE_EDIT)
 	public AjaxJson update(TbGoodsType t){
 		tbGoodsTypeService.update(t);
 		return AjaxJson.getSuccess();
@@ -59,7 +59,7 @@ public class TbGoodsTypeController {
 
 	/** 查 - 根据id */  
 	@RequestMapping("getById")
-		@SaCheckPermission(TbGoodsType.PERMISSION_CODE)
+//		@SaCheckPermission(TbGoodsType.PERMISSION_CODE)
 	public AjaxJson getById(String id){
 		TbGoodsType t = tbGoodsTypeService.getById(id);
 		return AjaxJson.getSuccessData(t);
@@ -67,7 +67,7 @@ public class TbGoodsTypeController {
 
 	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
 	@RequestMapping("getList")
-		@SaCheckPermission(TbGoodsType.PERMISSION_CODE)
+//		@SaCheckPermission(TbGoodsType.PERMISSION_CODE)
 	public AjaxJson getList() { 
 		SoMap so = SoMap.getRequestSoMap();
 		List<TbGoodsType> list = tbGoodsTypeService.getList(so.startPage());

+ 8 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_group/TbGroupController.java

@@ -216,9 +216,16 @@ public class TbGroupController {
 	/*------            正常业务👆👆    rpc远程调用👇👇                         -----------*/
 
 	/** 用户在APP注册时选择身份则创建一个对应身份的实体 */
-	@RequestMapping("groupDto")
+	@RequestMapping("rpc/groupDto")
 	public boolean groupDto(@RequestBody GroupDto groupDto){
 		return tbGroupService.groupDto(groupDto);
 	}
 
+	/** 查 - 根据id */
+	@RequestMapping("rpc/getRpcById")
+	public GroupDto getRpcById(@RequestParam("id") String id){
+		GroupDto t = tbGroupService.getRpcById(id);
+		return t;
+	}
+
 }

+ 8 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_group/TbGroupService.java

@@ -348,5 +348,13 @@ public class TbGroupService extends ServiceImpl<TbGroupMapper, TbGroup> implemen
 		return save;
 	}
 
+	/** 远程调用方法 获取边民组的基本信息*/
+	GroupDto getRpcById(String id) {
+		TbGroup byId = super.getById(id);
+		GroupDto groupDto = new GroupDto();
+		BeanUtils.copyProperties(byId,groupDto);
+		return groupDto;
+	}
+
 }
 

+ 60 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order/MethodOrderService.java

@@ -0,0 +1,60 @@
+package com.pj.tb_order;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.pj.common.core.exception.ServiceException;
+import com.pj.enummj.DeleteStatus;
+import com.pj.tb_people.TbPeople;
+import com.pj.tb_people.TbPeopleMapper;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 02 14 20
+ **/
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class MethodOrderService {
+
+    @Autowired
+    private TbOrderMapper tbOrderMapper;
+    @Autowired
+    private TbPeopleMapper tbPeopleMapper;
+
+    /**
+     * 根据类型返回对应的订单列表
+     * @param userType
+     */
+    public List<TbOrder> checkType(Integer userType, Long fk, SoMap so){
+        if(userType == null)return null;
+        if(fk == null)return null;
+        LambdaQueryWrapper<TbOrder> queryWrapper = new LambdaQueryWrapper<>();
+        switch (userType){
+            case 1: //边民
+                TbPeople tbPeople = tbPeopleMapper.selectById(fk);
+                if(tbPeople == null)throw new ServiceException("当前用户未认证边民!");
+                //根据组进行匹配订单
+                queryWrapper.eq(TbOrder::getGroupId,tbPeople.getGroupId());
+                break;
+            case 2: //互市组组长
+                queryWrapper.eq(TbOrder::getBuyUserId,fk);
+                break;
+            case 3: // 一级市场商家
+                queryWrapper.eq(TbOrder::getEnterpriseId,fk);
+                break;
+            default:
+                throw new RuntimeException("服务器繁忙~");
+        }
+        queryWrapper.eq(TbOrder::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode());
+        queryWrapper.orderByDesc(TbOrder::getCreateTime);
+        List<TbOrder> tbOrderList = tbOrderMapper.selectList(queryWrapper);
+        return tbOrderList;
+
+    }
+
+
+}

+ 10 - 2
sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrder.java

@@ -70,6 +70,10 @@ public class TbOrder extends Model<TbOrder> implements Serializable {
 	 *
 	 */
 	private Long saleMainId;
+	/**
+	 *
+	 */
+	private Long groupId;
 
 	/**
 	 *  商品ID
@@ -228,9 +232,13 @@ public class TbOrder extends Model<TbOrder> implements Serializable {
 	private String distribution;
 
 	/**
-	 * 是否确认(0=否,1=是)
+	 * 一级市场边民确认(0=待确认,1=是,2=否)[j]
+	 */
+	private Integer peopleConfirm;
+	/**
+	 * 一级市场商户确认(0=待确认,1=是,2=否)[j]
 	 */
-	private Integer confirm;
+	private Integer enterpriseConfirm;
 
 	/**
 	 * 是否接单

+ 2 - 2
sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderAppController.java

@@ -34,7 +34,8 @@ public class TbOrderAppController {
 //		@SaCheckPermission(TbOrder.PERMISSION_CODE)
 	public AjaxJson getList() {
 		SoMap so = SoMap.getRequestSoMap();
-		List<TbOrder> list = tbOrderService.getList(so.startPage());
+		List<TbOrder> list = tbOrderService.getAPPList(so.startPage());
+		if(list.size() == 0)return AjaxJson.getSuccess("暂无更多的订单消息!");
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}
 
@@ -53,7 +54,6 @@ public class TbOrderAppController {
 	public AjaxJson updateResaleStatus(Long orderId) {
 		boolean result = tbOrderService.updateResaleStatus(orderId);
 		if(result) return AjaxJson.getSuccess();
-
 		return AjaxJson.getError();
 	}
 

+ 9 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderDto.java

@@ -30,6 +30,10 @@ public class TbOrderDto {
 	 *
 	 */
 	private Long tradeAreaId;
+	/**
+	 *
+	 */
+	private Long groupId;
 
 	/**
 	 *
@@ -39,6 +43,11 @@ public class TbOrderDto {
 	/**
 	 *
 	 */
+	private String goodsImg;
+
+	/**
+	 *
+	 */
 	private String addressIds;
 
 	/**

+ 109 - 109
sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderMapper.xml

@@ -11,14 +11,14 @@
 	<!-- 通用映射:自动模式 -->
 	<resultMap id="model" autoMapping="true" type="com.pj.tb_order.TbOrder"></resultMap>
 
-
+<!-- id,trade_area_id,trade_no,trade_area_name,buy_user_name,buy_user_type,enterprise_name,total_weight,total_price,
+			   trade_time, trade_status, real_price,pay_type,should_price,goods_names,apply,confirm,pick,pick_time,
+			   send,send_time,level_two_order_id,goods_id,buy_user_id -->
 
 
 	<!-- 公共查询sql片段 -->
 	<sql id="select_sql">
-		select id,trade_area_id,trade_no,trade_area_name,buy_user_name,buy_user_type,enterprise_name,total_weight,total_price,
-			   trade_time, trade_status, real_price,pay_type,should_price,goods_names,apply,confirm,pick,pick_time,
-			   send,send_time,level_two_order_id,goods_id,buy_user_id
+		select *
 		from tb_order 
 	</sql>
 
@@ -26,111 +26,111 @@
 	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
 	<select id="getList" resultMap="model">
 		<include refid="select_sql"></include>
-<!--		<where>-->
-<!--			<if test=' this.has("id") '> and id = #{id} </if>-->
-<!--			<if test=' this.has("tradeAreaId") '> and trade_area_id = #{tradeAreaId} </if>-->
-<!--			<if test=' this.has("tradeAreaName") '> and trade_area_name = #{tradeAreaName} </if>-->
-<!--			<if test=' this.has("addressIds") '> and address_ids = #{addressIds} </if>-->
-<!--			<if test=' this.has("saleMainId") '> and sale_main_id = #{saleMainId} </if>-->
-<!--			<if test=' this.has("tradeNo") '> and trade_no = #{tradeNo} </if>-->
-<!--			<if test=' this.has("buyUserId") '> and buy_user_id = #{buyUserId} </if>-->
-<!--			<if test=' this.has("buyUserName") '> and buy_user_name = #{buyUserName} </if>-->
-<!--			<if test=' this.has("buyUserType") '> and buy_user_type = #{buyUserType} </if>-->
-<!--			<if test=' this.has("enterpriseId") '> and enterprise_id = #{enterpriseId} </if>-->
-<!--			<if test=' this.has("enterpriseName") '> and enterprise_name = #{enterpriseName} </if>-->
-<!--			<if test=' this.has("totalWeight") '> and total_weight = #{totalWeight} </if>-->
-<!--			<if test=' this.has("totalPrice") '> and total_price = #{totalPrice} </if>-->
-<!--			<if test=' this.has("tradeStatus") '> and trade_status = #{tradeStatus} </if>-->
-<!--			<if test=' this.has("payType") '> and pay_type = #{payType} </if>-->
-<!--			<if test=' this.has("settleTime") '> and settle_time = #{settleTime} </if>-->
-<!--			<if test=' this.has("realPrice") '> and real_price = #{realPrice} </if>-->
-<!--			<if test=' this.has("shouldPrice") '> and should_price = #{shouldPrice} </if>-->
-<!--			<if test=' this.has("settleUserId") '> and settle_user_id = #{settleUserId} </if>-->
-<!--			<if test=' this.has("recordUserId") '> and record_user_id = #{recordUserId} </if>-->
-<!--			<if test=' this.has("recordTime") '> and record_time = #{recordTime} </if>-->
-<!--			<if test=' this.has("record") '> and record = #{record} </if>-->
-<!--			<if test=' this.has("refundReason") '> and refund_reason = #{refundReason} </if>-->
-<!--			<if test=' this.has("refundTime") '> and refund_time = #{refundTime} </if>-->
-<!--			<if test=' this.has("receiveName") '> and receive_name = #{receiveName} </if>-->
-<!--			<if test=' this.has("receivePhone") '> and receive_phone = #{receivePhone} </if>-->
-<!--			<if test=' this.has("receiveAddress") '> and receive_address = #{receiveAddress} </if>-->
-<!--			<if test=' this.has("outTime") '> and out_time = #{outTime} </if>-->
-<!--			<if test=' this.has("goodsNames") '> and goods_names = #{goodsNames} </if>-->
-<!--			<if test=' this.has("apply") '> and apply = #{apply} </if>-->
-<!--			<if test=' this.has("applyTime") '> and apply_time = #{applyTime} </if>-->
-<!--			<if test=' this.has("applyResult") '> and apply_result = #{applyResult} </if>-->
-<!--			<if test=' this.has("applyFailReason") '> and apply_fail_reason = #{applyFailReason} </if>-->
-<!--			<if test=' this.has("distribution") '> and distribution = #{distribution} </if>-->
-<!--			<if test=' this.has("confirm") '> and confirm = #{confirm} </if>-->
-<!--			<if test=' this.has("pick") '> and pick = #{pick} </if>-->
-<!--			<if test=' this.has("pickTime") '> and pick_time = #{pickTime} </if>-->
-<!--			<if test=' this.has("shopId") '> and shop_id = #{shopId} </if>-->
-<!--			<if test=' this.has("shopName") '> and shop_name = #{shopName} </if>-->
-<!--			<if test=' this.has("send") '> and send = #{send} </if>-->
-<!--			<if test=' this.has("sendTime") '> and send_time = #{sendTime} </if>-->
-<!--			<if test=' this.has("levelTwoOrderId") '> and level_two_order_id = #{levelTwoOrderId} </if>-->
-<!--			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>-->
-<!--			<if test=' this.has("createBy") '> and create_by = #{createBy} </if>-->
-<!--			<if test=' this.has("createName") '> and create_name = #{createName} </if>-->
-<!--			<if test=' this.has("updateTime") '> and update_time = #{updateTime} </if>-->
-<!--			<if test=' this.has("updateBy") '> and update_by = #{updateBy} </if>-->
-<!--			<if test=' this.has("updateName") '> and update_name = #{updateName} </if>-->
-<!--			<if test=' this.has("deleteStatus") '> and delete_status = #{deleteStatus} </if>-->
-<!--		</where>-->
-<!--		order by-->
-<!--		<choose>-->
-<!--			<when test='sortType == 1'> id desc </when>-->
-<!--			<when test='sortType == 2'> trade_area_id desc </when>-->
-<!--			<when test='sortType == 3'> trade_area_name desc </when>-->
-<!--			<when test='sortType == 4'> address_ids desc </when>-->
-<!--			<when test='sortType == 5'> sale_main_id desc </when>-->
-<!--			<when test='sortType == 6'> trade_no desc </when>-->
-<!--			<when test='sortType == 7'> buy_user_id desc </when>-->
-<!--			<when test='sortType == 8'> buy_user_name desc </when>-->
-<!--			<when test='sortType == 9'> buy_user_type desc </when>-->
-<!--			<when test='sortType == 10'> enterprise_id desc </when>-->
-<!--			<when test='sortType == 11'> enterprise_name desc </when>-->
-<!--			<when test='sortType == 12'> total_weight desc </when>-->
-<!--			<when test='sortType == 13'> total_price desc </when>-->
-<!--			<when test='sortType == 14'> trade_time desc </when>-->
-<!--			<when test='sortType == 15'> trade_status desc </when>-->
-<!--			<when test='sortType == 16'> pay_type desc </when>-->
-<!--			<when test='sortType == 17'> settle_time desc </when>-->
-<!--			<when test='sortType == 18'> real_price desc </when>-->
-<!--			<when test='sortType == 19'> should_price desc </when>-->
-<!--			<when test='sortType == 20'> settle_user_id desc </when>-->
-<!--			<when test='sortType == 21'> record_user_id desc </when>-->
-<!--			<when test='sortType == 22'> record_time desc </when>-->
-<!--			<when test='sortType == 23'> record desc </when>-->
-<!--			<when test='sortType == 24'> refund_reason desc </when>-->
-<!--			<when test='sortType == 25'> refund_time desc </when>-->
-<!--			<when test='sortType == 26'> receive_name desc </when>-->
-<!--			<when test='sortType == 27'> receive_phone desc </when>-->
-<!--			<when test='sortType == 28'> receive_address desc </when>-->
-<!--			<when test='sortType == 29'> out_time desc </when>-->
-<!--			<when test='sortType == 30'> goods_names desc </when>-->
-<!--			<when test='sortType == 31'> apply desc </when>-->
-<!--			<when test='sortType == 32'> apply_time desc </when>-->
-<!--			<when test='sortType == 33'> apply_result desc </when>-->
-<!--			<when test='sortType == 34'> apply_fail_reason desc </when>-->
-<!--			<when test='sortType == 35'> distribution desc </when>-->
-<!--			<when test='sortType == 36'> confirm desc </when>-->
-<!--			<when test='sortType == 37'> pick desc </when>-->
-<!--			<when test='sortType == 38'> pick_time desc </when>-->
-<!--			<when test='sortType == 39'> shop_id desc </when>-->
-<!--			<when test='sortType == 40'> shop_name desc </when>-->
-<!--			<when test='sortType == 41'> send desc </when>-->
-<!--			<when test='sortType == 42'> send_time desc </when>-->
-<!--			<when test='sortType == 43'> level_two_order_id desc </when>-->
-<!--			<when test='sortType == 44'> create_time desc </when>-->
-<!--			<when test='sortType == 45'> create_by desc </when>-->
-<!--			<when test='sortType == 46'> create_name desc </when>-->
-<!--			<when test='sortType == 47'> update_time desc </when>-->
-<!--			<when test='sortType == 48'> update_by desc </when>-->
-<!--			<when test='sortType == 49'> update_name desc </when>-->
-<!--			<when test='sortType == 50'> delete_status desc </when>-->
-<!--			<otherwise> id desc </otherwise>-->
-<!--		</choose>-->
+		<where>
+			<if test=' this.has("id") '> and id = #{id} </if>
+			<if test=' this.has("tradeAreaId") '> and trade_area_id = #{tradeAreaId} </if>
+			<if test=' this.has("tradeAreaName") '> and trade_area_name = #{tradeAreaName} </if>
+			<if test=' this.has("addressIds") '> and address_ids = #{addressIds} </if>
+			<if test=' this.has("saleMainId") '> and sale_main_id = #{saleMainId} </if>
+			<if test=' this.has("tradeNo") '> and trade_no = #{tradeNo} </if>
+			<if test=' this.has("buyUserId") '> and buy_user_id = #{buyUserId} </if>
+			<if test=' this.has("buyUserName") '> and buy_user_name = #{buyUserName} </if>
+			<if test=' this.has("buyUserType") '> and buy_user_type = #{buyUserType} </if>
+			<if test=' this.has("enterpriseId") '> and enterprise_id = #{enterpriseId} </if>
+			<if test=' this.has("enterpriseName") '> and enterprise_name = #{enterpriseName} </if>
+			<if test=' this.has("totalWeight") '> and total_weight = #{totalWeight} </if>
+			<if test=' this.has("totalPrice") '> and total_price = #{totalPrice} </if>
+			<if test=' this.has("tradeStatus") '> and trade_status = #{tradeStatus} </if>
+			<if test=' this.has("payType") '> and pay_type = #{payType} </if>
+			<if test=' this.has("settleTime") '> and settle_time = #{settleTime} </if>
+			<if test=' this.has("realPrice") '> and real_price = #{realPrice} </if>
+			<if test=' this.has("shouldPrice") '> and should_price = #{shouldPrice} </if>
+			<if test=' this.has("settleUserId") '> and settle_user_id = #{settleUserId} </if>
+			<if test=' this.has("recordUserId") '> and record_user_id = #{recordUserId} </if>
+			<if test=' this.has("recordTime") '> and record_time = #{recordTime} </if>
+			<if test=' this.has("record") '> and record = #{record} </if>
+			<if test=' this.has("refundReason") '> and refund_reason = #{refundReason} </if>
+			<if test=' this.has("refundTime") '> and refund_time = #{refundTime} </if>
+			<if test=' this.has("receiveName") '> and receive_name = #{receiveName} </if>
+			<if test=' this.has("receivePhone") '> and receive_phone = #{receivePhone} </if>
+			<if test=' this.has("receiveAddress") '> and receive_address = #{receiveAddress} </if>
+			<if test=' this.has("outTime") '> and out_time = #{outTime} </if>
+			<if test=' this.has("goodsNames") '> and goods_names = #{goodsNames} </if>
+			<if test=' this.has("apply") '> and apply = #{apply} </if>
+			<if test=' this.has("applyTime") '> and apply_time = #{applyTime} </if>
+			<if test=' this.has("applyResult") '> and apply_result = #{applyResult} </if>
+			<if test=' this.has("applyFailReason") '> and apply_fail_reason = #{applyFailReason} </if>
+			<if test=' this.has("distribution") '> and distribution = #{distribution} </if>
+			<if test=' this.has("confirm") '> and confirm = #{confirm} </if>
+			<if test=' this.has("pick") '> and pick = #{pick} </if>
+			<if test=' this.has("pickTime") '> and pick_time = #{pickTime} </if>
+			<if test=' this.has("shopId") '> and shop_id = #{shopId} </if>
+			<if test=' this.has("shopName") '> and shop_name = #{shopName} </if>
+			<if test=' this.has("send") '> and send = #{send} </if>
+			<if test=' this.has("sendTime") '> and send_time = #{sendTime} </if>
+			<if test=' this.has("levelTwoOrderId") '> and level_two_order_id = #{levelTwoOrderId} </if>
+			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>
+			<if test=' this.has("createBy") '> and create_by = #{createBy} </if>
+			<if test=' this.has("createName") '> and create_name = #{createName} </if>
+			<if test=' this.has("updateTime") '> and update_time = #{updateTime} </if>
+			<if test=' this.has("updateBy") '> and update_by = #{updateBy} </if>
+			<if test=' this.has("updateName") '> and update_name = #{updateName} </if>
+			<if test=' this.has("deleteStatus") '> and delete_status = #{deleteStatus} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> trade_area_id desc </when>
+			<when test='sortType == 3'> trade_area_name desc </when>
+			<when test='sortType == 4'> address_ids desc </when>
+			<when test='sortType == 5'> sale_main_id desc </when>
+			<when test='sortType == 6'> trade_no desc </when>
+			<when test='sortType == 7'> buy_user_id desc </when>
+			<when test='sortType == 8'> buy_user_name desc </when>
+			<when test='sortType == 9'> buy_user_type desc </when>
+			<when test='sortType == 10'> enterprise_id desc </when>
+			<when test='sortType == 11'> enterprise_name desc </when>
+			<when test='sortType == 12'> total_weight desc </when>
+			<when test='sortType == 13'> total_price desc </when>
+			<when test='sortType == 14'> trade_time desc </when>
+			<when test='sortType == 15'> trade_status desc </when>
+			<when test='sortType == 16'> pay_type desc </when>
+			<when test='sortType == 17'> settle_time desc </when>
+			<when test='sortType == 18'> real_price desc </when>
+			<when test='sortType == 19'> should_price desc </when>
+			<when test='sortType == 20'> settle_user_id desc </when>
+			<when test='sortType == 21'> record_user_id desc </when>
+			<when test='sortType == 22'> record_time desc </when>
+			<when test='sortType == 23'> record desc </when>
+			<when test='sortType == 24'> refund_reason desc </when>
+			<when test='sortType == 25'> refund_time desc </when>
+			<when test='sortType == 26'> receive_name desc </when>
+			<when test='sortType == 27'> receive_phone desc </when>
+			<when test='sortType == 28'> receive_address desc </when>
+			<when test='sortType == 29'> out_time desc </when>
+			<when test='sortType == 30'> goods_names desc </when>
+			<when test='sortType == 31'> apply desc </when>
+			<when test='sortType == 32'> apply_time desc </when>
+			<when test='sortType == 33'> apply_result desc </when>
+			<when test='sortType == 34'> apply_fail_reason desc </when>
+			<when test='sortType == 35'> distribution desc </when>
+			<when test='sortType == 36'> confirm desc </when>
+			<when test='sortType == 37'> pick desc </when>
+			<when test='sortType == 38'> pick_time desc </when>
+			<when test='sortType == 39'> shop_id desc </when>
+			<when test='sortType == 40'> shop_name desc </when>
+			<when test='sortType == 41'> send desc </when>
+			<when test='sortType == 42'> send_time desc </when>
+			<when test='sortType == 43'> level_two_order_id desc </when>
+			<when test='sortType == 44'> create_time desc </when>
+			<when test='sortType == 45'> create_by desc </when>
+			<when test='sortType == 46'> create_name desc </when>
+			<when test='sortType == 47'> update_time desc </when>
+			<when test='sortType == 48'> update_by desc </when>
+			<when test='sortType == 49'> update_name desc </when>
+			<when test='sortType == 50'> delete_status desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
 	</select>
 	
 	

+ 22 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_order/TbOrderService.java

@@ -26,6 +26,9 @@ public class TbOrderService extends ServiceImpl<TbOrderMapper, TbOrder> implemen
 	@Autowired
 	TbOrderMapper tbOrderMapper;
 
+	@Autowired
+	private MethodOrderService methodOrderService;
+
 	/** 增 */
 	void add(TbOrder t){
 		save(t);
@@ -52,6 +55,24 @@ public class TbOrderService extends ServiceImpl<TbOrderMapper, TbOrder> implemen
 		return tbOrderMapper.getList(so);
 	}
 
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * APP专用 与该订单相关的任何人员能看
+	 * @param so
+	 * @return
+	 */
+	List<TbOrder> getAPPList(SoMap so) {
+		//获取登录用户,登录的用户也许边民,互市组组长,一级市场商家
+		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
+		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
+			throw new RuntimeException("当前登录账号信息已失效!");
+		Integer userType = appLoginInfo.getUserType();
+		//与订单相关的人能看
+		List<TbOrder> tbOrderList = methodOrderService.checkType(userType,appLoginInfo.getFk(),so);
+		return tbOrderList;
+	}
+
 	/** 获取当前登陆人订单集合 */
 	public List<TbOrder> selectSelfOrders(SoMap so) {
 		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
@@ -61,7 +82,7 @@ public class TbOrderService extends ServiceImpl<TbOrderMapper, TbOrder> implemen
 		return tbOrderMapper.getList(so);
 	}
 
-	/** 查 转售列表:边民查看已完结订单,包括已转售/未转售 */
+	/** 查 转售列表:边民组长查看已完结订单,包括已转售/未转售 */
 	List<TbOrder> getResaleOrders() {
 		//获取app登录用户
 		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();

+ 79 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirm.java

@@ -0,0 +1,79 @@
+package com.pj.tb_order_people_confirm;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.EqualsAndHashCode;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * Model: tb_order_people_confirm -- 便民确认订单监听表
+ * @author yzs 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbOrderPeopleConfirm.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbOrderPeopleConfirm extends Model<TbOrderPeopleConfirm> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_order_people_confirm";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-order-people-confirm";
+	public static final String PERMISSION_CODE_ADD = "tb-order-people-confirm-add";
+	public static final String PERMISSION_CODE_EDIT = "tb-order-people-confirm-edit";
+	public static final String PERMISSION_CODE_DEL = "tb-order-people-confirm-del";
+
+
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 * 便民确认监听表主键ID 
+	 */
+	@TableId(type = IdType.AUTO)
+	private Integer id;	
+
+	/**
+	 * 一级订单表主键ID 
+	 */
+	private Long orderId;	
+
+	/**
+	 * 一级市场边民ID 
+	 */
+	private Long peopleId;	
+
+	/**
+	 * 组ID 
+	 */
+	private Long groupId;	
+
+	/**
+	 * 边民确认时间 
+	 */
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+
+
+
+
+	
+
+
+}

+ 87 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmController.java

@@ -0,0 +1,87 @@
+package com.pj.tb_order_people_confirm;
+
+import java.util.List;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import com.pj.utils.sg.*;
+import com.pj.project4sp.SP;
+
+import com.pj.current.satoken.StpUserUtil;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+
+/**
+ * Controller: tb_order_people_confirm -- 便民确认订单监听表
+ * @author yzs 
+ */
+@RestController
+@RequestMapping("/TbOrderPeopleConfirm/")
+public class TbOrderPeopleConfirmController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbOrderPeopleConfirmService tbOrderPeopleConfirmService;
+
+	/** 增 */  
+	@RequestMapping("add")
+	@SaCheckPermission(TbOrderPeopleConfirm.PERMISSION_CODE_ADD)
+	public AjaxJson add(TbOrderPeopleConfirm t){
+		tbOrderPeopleConfirmService.add(t);
+		t = tbOrderPeopleConfirmService.getById(SP.publicMapper.getPrimarykey());
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 删 */  
+	@RequestMapping("delete")
+	@SaCheckPermission(TbOrderPeopleConfirm.PERMISSION_CODE_DEL)
+	public AjaxJson delete(Long id){
+		 tbOrderPeopleConfirmService.delete(id);
+		return AjaxJson.getSuccess();
+	}
+	
+	/** 删 - 根据id列表 */  
+	@RequestMapping("deleteByIds")
+	@SaCheckPermission(TbOrderPeopleConfirm.PERMISSION_CODE_DEL)
+	public AjaxJson deleteByIds(){
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
+		int line = SP.publicMapper.deleteByIds(TbOrderPeopleConfirm.TABLE_NAME, ids);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 改 */  
+	@RequestMapping("update")
+	@SaCheckPermission(TbOrderPeopleConfirm.PERMISSION_CODE_EDIT)
+	public AjaxJson update(TbOrderPeopleConfirm t){
+		tbOrderPeopleConfirmService.update(t);
+		return AjaxJson.getSuccess();
+	}
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+		@SaCheckPermission(TbOrderPeopleConfirm.PERMISSION_CODE)
+	public AjaxJson getById(Integer id){
+		TbOrderPeopleConfirm t = tbOrderPeopleConfirmService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	@RequestMapping("getList")
+		@SaCheckPermission(TbOrderPeopleConfirm.PERMISSION_CODE)
+	public AjaxJson getList() { 
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbOrderPeopleConfirm> list = tbOrderPeopleConfirmService.getList(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+	
+	
+	
+	
+
+	
+	
+	
+
+}

+ 30 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmMapper.java

@@ -0,0 +1,30 @@
+package com.pj.tb_order_people_confirm;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.pj.utils.so.*;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Mapper: tb_order_people_confirm -- 便民确认订单监听表
+ * @author yzs 
+ */
+
+@Mapper
+@Repository
+public interface TbOrderPeopleConfirmMapper extends BaseMapper <TbOrderPeopleConfirm> {
+
+
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbOrderPeopleConfirm> getList(SoMap so);
+
+
+}

+ 51 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmMapper.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pj.tb_order_people_confirm.TbOrderPeopleConfirmMapper">
+
+
+
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, order_id, people_id, group_id, create_time from tb_order_people_confirm  -->
+	
+	<!-- 通用映射:自动模式 -->
+	<resultMap id="model" autoMapping="true" type="com.pj.tb_order_people_confirm.TbOrderPeopleConfirm"></resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_order_people_confirm 
+	</sql>
+
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.has("id") '> and id = #{id} </if>
+			<if test=' this.has("orderId") '> and order_id = #{orderId} </if>
+			<if test=' this.has("peopleId") '> and people_id = #{peopleId} </if>
+			<if test=' this.has("groupId") '> and group_id = #{groupId} </if>
+			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> order_id desc </when>
+			<when test='sortType == 3'> people_id desc </when>
+			<when test='sortType == 4'> group_id desc </when>
+			<when test='sortType == 5'> create_time desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 51 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmService.java

@@ -0,0 +1,51 @@
+package com.pj.tb_order_people_confirm;
+
+import java.util.List;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+import com.pj.utils.sg.*;
+
+/**
+ * Service: tb_order_people_confirm -- 便民确认订单监听表
+ * @author yzs 
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class TbOrderPeopleConfirmService extends ServiceImpl<TbOrderPeopleConfirmMapper, TbOrderPeopleConfirm> implements IService<TbOrderPeopleConfirm>{
+
+	/** 底层 Mapper 对象 */
+	@Autowired
+	TbOrderPeopleConfirmMapper tbOrderPeopleConfirmMapper;
+
+	/** 增 */
+	void add(TbOrderPeopleConfirm t){
+		save(t);
+	}
+
+	/** 删 */
+	void delete(Long id){
+		removeById(id);
+	}
+
+	/** 改 */
+	void update(TbOrderPeopleConfirm t){
+		updateById(t);
+
+	}
+
+	/** 查 */
+	TbOrderPeopleConfirm getById(Integer id){
+		return super.getById(id);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	List<TbOrderPeopleConfirm> getList(SoMap so) { 
+		return tbOrderPeopleConfirmMapper.getList(so);	
+	}
+	
+
+}

+ 27 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_order_people_confirm/TbOrderPeopleConfirmUtil.java

@@ -0,0 +1,27 @@
+package com.pj.tb_order_people_confirm;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 工具类:tb_order_people_confirm -- 便民确认订单监听表
+ * @author yzs 
+ *
+ */
+@Component
+public class TbOrderPeopleConfirmUtil {
+
+	
+	/** 底层 Mapper 对象 */
+	public static TbOrderPeopleConfirmMapper tbOrderPeopleConfirmMapper;
+	@Autowired
+	private void setTbOrderPeopleConfirmMapper(TbOrderPeopleConfirmMapper tbOrderPeopleConfirmMapper) {
+		TbOrderPeopleConfirmUtil.tbOrderPeopleConfirmMapper = tbOrderPeopleConfirmMapper;
+	}
+	
+
+
+	
+	
+	
+}

+ 8 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_people/TbPeopleAppController.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.pj.utils.sg.AjaxJson;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -32,4 +33,11 @@ public class TbPeopleAppController {
         return AjaxJson.getSuccess();
     }
 
+    /** 边民确认订单 */
+    @RequestMapping("confirmOrder")
+    public AjaxJson confirmOrder(@RequestParam("confirm")Integer confirm,@RequestParam("orderId")Long orderId){
+        tbPeopleService.confirmOrder(confirm,orderId);
+        return AjaxJson.getSuccess();
+    }
+
 }

+ 15 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_people/TbPeopleController.java

@@ -191,11 +191,25 @@ public class TbPeopleController {
 	/*------            正常业务👆👆    rpc远程调用👇👇                         -----------*/
 
 	/** 注册身份时对应的表添加数据 */
-	@RequestMapping("peopleDto")
+	@RequestMapping("rpc/peopleDto")
 	public boolean peopleDto(@RequestBody PeopleDto peopleDto){
 		boolean dto = tbPeopleService.peopleDto(peopleDto);
 		return dto;
 	}
+	/** 根据ID获取边民信息 */
+	@RequestMapping("rpc/getRpcById")
+	public PeopleDto getRpcById(@RequestParam("id")Long peopleId){
+		PeopleDto rpcById = tbPeopleService.getRpcById(peopleId);
+		return rpcById;
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */
+	@RequestMapping("rpc/getPeopleList")
+	public List<PeopleDto> getPeopleList(@RequestParam("groupId")Long groupId) {
+		SoMap so = SoMap.getRequestSoMap();
+		List<PeopleDto> list = tbPeopleService.getPeopleList(so.startPage(),groupId);
+		return list;
+	}
 
 
 }

+ 85 - 3
sp-service/level-one-server/src/main/java/com/pj/tb_people/TbPeopleService.java

@@ -10,13 +10,21 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pj.api.client.admin.AdminInterface;
 import com.pj.api.dto.AppUserDto;
 import com.pj.api.dto.PeopleDto;
+import com.pj.common.core.exception.ServiceException;
+import com.pj.common.core.utils.DateUtil;
+import com.pj.current.dto.APPLoginUserInfo;
 import com.pj.current.dto.PCLoginUserInfo;
+import com.pj.current.satoken.StpAPPUserUtil;
 import com.pj.current.satoken.StpUserUtil;
 import com.pj.enummj.DeleteStatus;
 import com.pj.enummj.IsLock;
 import com.pj.enummj.People;
 import com.pj.tb_group.TbGroup;
 import com.pj.tb_group.TbGroupMapper;
+import com.pj.tb_order.TbOrder;
+import com.pj.tb_order.TbOrderMapper;
+import com.pj.tb_order_people_confirm.TbOrderPeopleConfirm;
+import com.pj.tb_order_people_confirm.TbOrderPeopleConfirmMapper;
 import com.pj.tb_people.dto.StartStopDto;
 import com.pj.tb_people.vo.ApplyPeopleVo;
 import com.pj.utils.sg.AjaxJson;
@@ -36,9 +44,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * Service: tb_people -- 边民
@@ -57,6 +63,12 @@ public class TbPeopleService extends ServiceImpl<TbPeopleMapper, TbPeople> imple
 
 	@Autowired
 	private AdminInterface adminInterface;
+	/** 边民确认订单 */
+	@Autowired
+	private TbOrderPeopleConfirmMapper tbOrderPeopleConfirmMapper;
+	/** 订单对象 */
+	@Autowired
+	private TbOrderMapper tbOrderMapper;
 
 
 	@Autowired
@@ -248,7 +260,50 @@ public class TbPeopleService extends ServiceImpl<TbPeopleMapper, TbPeople> imple
 		return line;
 	}
 
+	/**
+	 *  边民确认订单
+	 * @param confirm 1=确认,0=拒绝
+	 * @param orderId 一级市场订单表ID
+	 */
+	public void confirmOrder(Integer confirm,Long orderId){
+		//获取登录人
+		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
+		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
+			throw new RuntimeException("当前登录账号信息已失效!");
+		//查询当前边民
+		TbPeople tbPeople = tbPeopleMapper.selectById(appLoginInfo.getFk());
+		if(tbPeople == null)
+			throw new ServiceException("当前边民暂未认证!");
+		//执行确认 todo:调用人脸认证
+		TbOrderPeopleConfirm tbOrderPeopleConfirm = new TbOrderPeopleConfirm();
+		tbOrderPeopleConfirm.setPeopleId(tbPeople.getId());
+		tbOrderPeopleConfirm.setGroupId(tbPeople.getGroupId());
+		tbOrderPeopleConfirm.setOrderId(orderId);
+		tbOrderPeopleConfirm.setCreateTime(new Date());
+		int insert = tbOrderPeopleConfirmMapper.insert(tbOrderPeopleConfirm);
+		//执行查询订单完成情况
+		if(insert == 1){
+			//查询当前互市组的人数
+			Integer selectCount = tbPeopleMapper.selectCount
+					(new LambdaQueryWrapper<TbPeople>()
+							.eq(TbPeople::getGroupId, tbPeople.getGroupId())
+							.eq(TbPeople::getIsLock, IsLock.IS_LOCK_ON.getCode())
+							.eq(TbPeople::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode()));
+			//查询已确认的边民的数量
+			List<TbOrderPeopleConfirm> selectList = tbOrderPeopleConfirmMapper.selectList
+					(new LambdaQueryWrapper<TbOrderPeopleConfirm>().eq(TbOrderPeopleConfirm::getOrderId,orderId));
+			//判断已确认的边民数量
+			if(selectList.size() == selectCount){
+				//执行边民确认
+				TbOrder tbOrder = tbOrderMapper.selectById(orderId);
+				if(tbOrder == null)throw new RuntimeException("当前订单已被组长取消!");
+				tbOrder.setPeopleConfirm(1);
+				int updateById = tbOrderMapper.updateById(tbOrder);
+				if(updateById != 1)throw new RuntimeException("执行边民确认异常!");
+			}
+		}
 
+	}
 
 
 
@@ -420,4 +475,31 @@ public class TbPeopleService extends ServiceImpl<TbPeopleMapper, TbPeople> imple
 		return save;
 	}
 
+	/** 远程调用查 */
+	PeopleDto getRpcById(Long id){
+		TbPeople byId = super.getById(id);
+		PeopleDto peopleDto = new PeopleDto();
+		BeanUtils.copyProperties(byId,peopleDto);
+		return peopleDto;
+	}
+
+
+	/** 查集合 远程调用 */
+	List<PeopleDto> getPeopleList(SoMap so,Long groupId) {
+		so.set("group_id",groupId);
+		so.set("is_lock",IsLock.IS_LOCK_ON.getCode());
+		so.set("delete_status",DeleteStatus.DELETE_STATUS_ON.getCode());
+		List<TbPeople> tbPeople = tbPeopleMapper.getList(so);
+		if(tbPeople.size() == 0)return null;
+		//创建返回值集合
+		List<PeopleDto> resultDto = new ArrayList<>();
+		//遍历封装
+		tbPeople.forEach(item -> {
+			PeopleDto peopleDto = new PeopleDto();
+			BeanUtils.copyProperties(item,peopleDto);
+			resultDto.add(peopleDto);
+		});
+		return resultDto;
+	}
+
 }

+ 103 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/AppTbDemandQuotationController.java

@@ -0,0 +1,103 @@
+package com.pj.tb_demand_quotation;
+
+import com.pj.project4sp.SP;
+import com.pj.tb_demand_quotation.param.DemandQuotationParam;
+import com.pj.utils.sg.AjaxJson;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * app: tb_demand_quotation -- 一级市场组长需求抢购表
+ * @author yzs 
+ */
+@RestController
+@RequestMapping("/app/TbDemandQuotation/")
+public class AppTbDemandQuotationController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbDemandQuotationService tbDemandQuotationService;
+
+	/** 增 */  
+	@RequestMapping("add")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_ADD)
+	public AjaxJson add(TbDemandQuotation t){
+		tbDemandQuotationService.add(t);
+		t = tbDemandQuotationService.getById(SP.publicMapper.getPrimarykey());
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 删 */  
+	@RequestMapping("delete")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_DEL)
+	public AjaxJson delete(Long id){
+		 tbDemandQuotationService.delete(id);
+		return AjaxJson.getSuccess();
+	}
+	
+	/** 删 - 根据id列表 */  
+	@RequestMapping("deleteByIds")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_DEL)
+	public AjaxJson deleteByIds(){
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
+		int line = SP.publicMapper.deleteByIds(TbDemandQuotation.TABLE_NAME, ids);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 改 */  
+	@RequestMapping("update")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_EDIT)
+	public AjaxJson update(TbDemandQuotation t){
+		tbDemandQuotationService.update(t);
+		return AjaxJson.getSuccess();
+	}
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+//		@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE)
+	public AjaxJson getById(Long id){
+		TbDemandQuotation t = tbDemandQuotationService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	@RequestMapping("getList")
+//		@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE)
+	public AjaxJson getList() { 
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbDemandQuotation> list = tbDemandQuotationService.getList(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+
+
+	/**
+	 * 一级市场组长接单
+	 * @param demandQuotationParam
+	 * @return
+	 * @throws Exception
+	 */
+	@RequestMapping("quotation")
+//		@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE)
+	public AjaxJson quotation(@Validated @RequestBody DemandQuotationParam demandQuotationParam) throws Exception {
+		boolean quotation = tbDemandQuotationService.quotation(demandQuotationParam);
+		if(!quotation)return AjaxJson.getError("抢单失败!");
+		return AjaxJson.getSuccess();
+	}
+
+
+
+
+
+
+
+
+
+}

+ 125 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotation.java

@@ -0,0 +1,125 @@
+package com.pj.tb_demand_quotation;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.EqualsAndHashCode;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * Model: tb_demand_quotation -- 一级市场组长需求报价表
+ * @author yzs 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbDemandQuotation.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbDemandQuotation extends Model<TbDemandQuotation> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_demand_quotation";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-demand-quotation";
+	public static final String PERMISSION_CODE_ADD = "tb-demand-quotation-add";
+	public static final String PERMISSION_CODE_EDIT = "tb-demand-quotation-edit";
+	public static final String PERMISSION_CODE_DEL = "tb-demand-quotation-del";
+
+
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 * 一级市场组长需求报价表ID
+	 */
+	@TableId(type = IdType.AUTO)
+	private Long id;	
+
+	/**
+	 * 一级市场互市组组长ID(tb_people) 
+	 */
+	private Long leaderId;	
+	/**
+	 * 组ID
+	 */
+	private Long groupId;
+
+	/**
+	 * 组名称 
+	 */
+	private String groupName;	
+	/**
+	 *  联系电话
+	 */
+	private String linkPhone;
+
+	/**
+	 * 二级市场收购商需求表ID 
+	 */
+	private Long demandId;
+
+	/**
+	 * 二级市场收购商需求表ID
+	 */
+	private Long trade_area_id;
+
+	/**
+	 * 报价(CNY) 
+	 */
+	private Double quotation;	
+
+	/**
+	 * 创建人编号 
+	 */
+	private Long createBy;
+	/**
+	 * 二级市场收购商ID(tb_purchaser)
+	 */
+	private Long purchaserId;
+
+	/**
+	 * 创建人名称(报价人) 
+	 */
+	private String createName;	
+	/**
+	 * 组长备注
+	 */
+	private String remark;
+
+	/**
+	 * 创建时间 
+	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date createTime;
+
+	/**
+	 * 删除状态 
+	 */
+	private Integer deleteStatus;
+
+	/**
+	 * 报价结果[0=待确认,1=确认,2=拒绝]
+	 */
+	private Integer quotationResult;
+
+
+
+
+
+	
+
+
+}

+ 87 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationController.java

@@ -0,0 +1,87 @@
+package com.pj.tb_demand_quotation;
+
+import java.util.List;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import com.pj.utils.sg.*;
+import com.pj.project4sp.SP;
+
+import com.pj.current.satoken.StpUserUtil;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+
+/**
+ * Controller: tb_demand_quotation -- 一级市场组长需求抢购表
+ * @author yzs 
+ */
+@RestController
+@RequestMapping("/TbDemandQuotation/")
+public class TbDemandQuotationController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbDemandQuotationService tbDemandQuotationService;
+
+	/** 增 */  
+	@RequestMapping("add")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_ADD)
+	public AjaxJson add(TbDemandQuotation t){
+		tbDemandQuotationService.add(t);
+		t = tbDemandQuotationService.getById(SP.publicMapper.getPrimarykey());
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 删 */  
+	@RequestMapping("delete")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_DEL)
+	public AjaxJson delete(Long id){
+		 tbDemandQuotationService.delete(id);
+		return AjaxJson.getSuccess();
+	}
+	
+	/** 删 - 根据id列表 */  
+	@RequestMapping("deleteByIds")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_DEL)
+	public AjaxJson deleteByIds(){
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
+		int line = SP.publicMapper.deleteByIds(TbDemandQuotation.TABLE_NAME, ids);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 改 */  
+	@RequestMapping("update")
+//	@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE_EDIT)
+	public AjaxJson update(TbDemandQuotation t){
+		tbDemandQuotationService.update(t);
+		return AjaxJson.getSuccess();
+	}
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+//		@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE)
+	public AjaxJson getById(Long id){
+		TbDemandQuotation t = tbDemandQuotationService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	@RequestMapping("getList")
+//		@SaCheckPermission(TbDemandQuotation.PERMISSION_CODE)
+	public AjaxJson getList() { 
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbDemandQuotation> list = tbDemandQuotationService.getList(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+	
+	
+//
+	
+
+	
+	
+	
+
+}

+ 30 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationMapper.java

@@ -0,0 +1,30 @@
+package com.pj.tb_demand_quotation;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.pj.utils.so.*;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Mapper: tb_demand_quotation -- 一级市场组长需求抢购表
+ * @author yzs 
+ */
+
+@Mapper
+@Repository
+public interface TbDemandQuotationMapper extends BaseMapper <TbDemandQuotation> {
+
+
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbDemandQuotation> getList(SoMap so);
+
+
+}

+ 59 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationMapper.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pj.tb_demand_quotation.TbDemandQuotationMapper">
+
+
+
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, leader_id, group_name, demand_id, quotation, create_by, create_name, create_time, delete_status from tb_demand_quotation  -->
+	
+	<!-- 通用映射:自动模式 -->
+	<resultMap id="model" autoMapping="true" type="com.pj.tb_demand_quotation.TbDemandQuotation"></resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_demand_quotation 
+	</sql>
+
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.has("id") '> and id = #{id} </if>
+			<if test=' this.has("leaderId") '> and leader_id = #{leaderId} </if>
+			<if test=' this.has("groupName") '> and group_name = #{groupName} </if>
+			<if test=' this.has("demandId") '> and demand_id = #{demandId} </if>
+			<if test=' this.has("quotation") '> and quotation = #{quotation} </if>
+			<if test=' this.has("createBy") '> and create_by = #{createBy} </if>
+			<if test=' this.has("createName") '> and create_name = #{createName} </if>
+			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>
+			<if test=' this.has("deleteStatus") '> and delete_status = #{deleteStatus} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> leader_id desc </when>
+			<when test='sortType == 3'> group_name desc </when>
+			<when test='sortType == 4'> demand_id desc </when>
+			<when test='sortType == 5'> quotation desc </when>
+			<when test='sortType == 6'> create_by desc </when>
+			<when test='sortType == 7'> create_name desc </when>
+			<when test='sortType == 8'> create_time desc </when>
+			<when test='sortType == 9'> delete_status desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 117 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationService.java

@@ -0,0 +1,117 @@
+package com.pj.tb_demand_quotation;
+
+import java.util.Date;
+import java.util.List;
+
+import com.pj.api.client.level_one_server.LevelOneServerInterface;
+import com.pj.api.dto.PeopleDto;
+import com.pj.common.core.exception.ServiceException;
+import com.pj.current.dto.APPLoginUserInfo;
+import com.pj.current.satoken.StpAPPUserUtil;
+import com.pj.enummj.DeleteStatus;
+import com.pj.retry.SmsRetryService;
+import com.pj.tb_demand_quotation.param.DemandQuotationParam;
+import com.pj.tb_goods_demand.TbGoodsDemand;
+import com.pj.tb_goods_demand.TbGoodsDemandMapper;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Service: tb_demand_quotation -- 一级市场组长需求抢购表
+ * @author yzs 
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class TbDemandQuotationService extends ServiceImpl<TbDemandQuotationMapper, TbDemandQuotation> implements IService<TbDemandQuotation>{
+
+	/** 底层 Mapper 对象 */
+	@Autowired
+	TbDemandQuotationMapper tbDemandQuotationMapper;
+	/** 远程调用 */
+	@Autowired
+	private LevelOneServerInterface levelOneServerInterface;
+	/** 失败重试机制 */
+	@Autowired
+	private SmsRetryService smsRetryService;
+	/** 二级收购商需求 */
+	@Autowired
+	private TbGoodsDemandMapper tbGoodsDemandMapper;
+
+	/** 增 */
+	void add(TbDemandQuotation t){
+		save(t);
+	}
+
+	/** 删 */
+	void delete(Long id){
+		removeById(id);
+	}
+
+	/** 改 */
+	void update(TbDemandQuotation t){
+		updateById(t);
+
+	}
+
+	/** 查 */
+	TbDemandQuotation getById(Long id){
+		return super.getById(id);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	List<TbDemandQuotation> getList(SoMap so) { 
+		return tbDemandQuotationMapper.getList(so);	
+	}
+
+
+	/**
+	 * 互市组组长接单
+	 * @param demandQuotationParam
+	 */
+	public boolean quotation(DemandQuotationParam demandQuotationParam) throws Exception {
+		//获取并判断当前登陆人
+		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
+		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
+			throw new ServiceException("当前登录账号信息已失效!");
+		//判定接单状态
+		if(demandQuotationParam.getIsOrders() != 1)throw new ServiceException("非法操作!");
+		//获取边民组信息
+		PeopleDto rpcById = levelOneServerInterface.getRpcById(appLoginInfo.getFk());
+		if(rpcById == null)throw new ServiceException("边民组信息有误!");
+		//判断组长身份
+		if(rpcById.getRole() != 2)throw new ServiceException("您当前身份不是组长,无法抢单报价!");
+		//执行接单报价
+		TbDemandQuotation tbDemandQuotation = new TbDemandQuotation();
+		tbDemandQuotation.setQuotationResult(0); //默认待商家确认
+		tbDemandQuotation.setPurchaserId(demandQuotationParam.getPurchaserId()); // 商家ID
+		tbDemandQuotation.setDemandId(demandQuotationParam.getGoodsDemandId()); //需求表ID
+		tbDemandQuotation.setQuotation(demandQuotationParam.getPrice()); // 报价
+		tbDemandQuotation.setCreateBy(appLoginInfo.getLoginId()); //创建人登陆表主键
+		tbDemandQuotation.setLeaderId(appLoginInfo.getFk());  //边民表主键
+		tbDemandQuotation.setGroupName(rpcById.getGroupName()); // 互市组组名
+		tbDemandQuotation.setCreateTime(new Date()); //创建时间
+		tbDemandQuotation.setGroupId(rpcById.getGroupId());
+		tbDemandQuotation.setDeleteStatus(DeleteStatus.DELETE_STATUS_ON.getCode()); // 删除状态默认可用
+		int insert = tbDemandQuotationMapper.insert(tbDemandQuotation);
+		if(insert == 1){
+			//修改二级市场收购商的需求状态
+			TbGoodsDemand tbGoodsDemand = tbGoodsDemandMapper.selectById(demandQuotationParam.getGoodsDemandId());
+			if(tbGoodsDemand == null || tbGoodsDemand.getIsOrders() == 1 || tbGoodsDemand.getDeleteStatus() == 0)
+				throw new RuntimeException("二级市场收购商需求订单状态异常!");
+			//执行修改二级市场收购商需求状态
+			tbGoodsDemand.setIsOrders(demandQuotationParam.getIsOrders());
+			int updateById = tbGoodsDemandMapper.updateById(tbGoodsDemand);
+			if(updateById != 1)throw new RuntimeException("无法进行报价!");
+			//短信提示二级市场收购商,需求已报价,进入app进行确认接单 todo:该位置需打开 - 通知短信
+			return smsRetryService.sendSmsMsg(null);
+		}
+			throw new RuntimeException("抢单报价失败!");
+//		return true;
+	}
+	
+
+}

+ 27 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/TbDemandQuotationUtil.java

@@ -0,0 +1,27 @@
+package com.pj.tb_demand_quotation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 工具类:tb_demand_quotation -- 一级市场组长需求抢购表
+ * @author yzs 
+ *
+ */
+@Component
+public class TbDemandQuotationUtil {
+
+	
+	/** 底层 Mapper 对象 */
+	public static TbDemandQuotationMapper tbDemandQuotationMapper;
+	@Autowired
+	private void setTbDemandQuotationMapper(TbDemandQuotationMapper tbDemandQuotationMapper) {
+		TbDemandQuotationUtil.tbDemandQuotationMapper = tbDemandQuotationMapper;
+	}
+	
+
+
+	
+	
+	
+}

+ 30 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_demand_quotation/param/DemandQuotationParam.java

@@ -0,0 +1,30 @@
+package com.pj.tb_demand_quotation.param;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 03 16 30
+ **/
+@Data
+@NoArgsConstructor
+public class DemandQuotationParam {
+
+    /** 二级市场收购商需求表ID */
+    @NotBlank(message = "goodsDemandId")
+    private Long goodsDemandId;
+    /** 接单状态,默认传个 1 */
+    @NotBlank(message = "isOrders")
+    private Integer isOrders;
+    /** 报价 */
+    @NotBlank(message = "price")
+    private Double price;
+    /** 二级市场收购商主键ID */
+    @NotBlank(message = "purchaserId")
+    private Long purchaserId;
+    private String remark;
+
+}

+ 96 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/AppTbGoodsDemandController.java

@@ -0,0 +1,96 @@
+package com.pj.tb_goods_demand;
+
+import com.pj.project4sp.SP;
+import com.pj.tb_goods_demand.vo.GoodsDemandVo;
+import com.pj.utils.sg.AjaxJson;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * Controller: tb_goods_demand -- 二级收购商需求发布表
+ * @author yzs 
+ */
+@RestController
+@RequestMapping("/app/TbGoodsDemand/")
+public class AppTbGoodsDemandController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbGoodsDemandService tbGoodsDemandService;
+
+	/** 增 */  
+	@RequestMapping("add")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_ADD)
+	public AjaxJson add(TbGoodsDemand t){
+		tbGoodsDemandService.add(t);
+		t = tbGoodsDemandService.getById(SP.publicMapper.getPrimarykey());
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 删 */  
+	@RequestMapping("delete")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_DEL)
+	public AjaxJson delete(Long id){
+		 tbGoodsDemandService.delete(id);
+		return AjaxJson.getSuccess();
+	}
+	
+	/** 删 - 根据id列表 */  
+	@RequestMapping("deleteByIds")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_DEL)
+	public AjaxJson deleteByIds(){
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
+		int line = SP.publicMapper.deleteByIds(TbGoodsDemand.TABLE_NAME, ids);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 改 */  
+	@RequestMapping("update")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_EDIT)
+	public AjaxJson update(TbGoodsDemand t){
+		tbGoodsDemandService.update(t);
+		return AjaxJson.getSuccess();
+	}
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+//		@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE)
+	public AjaxJson getById(Long id){
+		TbGoodsDemand t = tbGoodsDemandService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** app端:专供给一级市场查看的需求列表*/
+	@RequestMapping("getAppList")
+//		@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE)
+	public AjaxJson getAppList(@RequestParam(value = "isOrders",required = false)Integer isOrders) {
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbGoodsDemand> list = tbGoodsDemandService.getAppList(so.startPage(),isOrders);
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+	
+	/** app端:专供给一级市场查看的需求列表*/
+	@RequestMapping("goodsDemandList")
+//		@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE)
+	public AjaxJson goodsDemandList(@RequestParam(value = "isOrders",required = false)Integer isOrders) {
+		SoMap so = SoMap.getRequestSoMap();
+		List<GoodsDemandVo> goodsDemandVos = tbGoodsDemandService.goodsDemandList(so.startPage(),isOrders);
+		return AjaxJson.getPageData(so.getDataCount(), goodsDemandVos);
+	}
+
+
+
+	
+	
+
+	
+	
+	
+
+}

+ 128 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/MethodGoodsDemandService.java

@@ -0,0 +1,128 @@
+package com.pj.tb_goods_demand;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.pj.api.client.level_one_server.LevelOneServerInterface;
+import com.pj.api.dto.GoodsDto;
+import com.pj.api.dto.PeopleDto;
+import com.pj.enummj.DeleteStatus;
+import com.pj.retry.SmsRetryService;
+import com.pj.tb_demand_quotation.TbDemandQuotation;
+import com.pj.tb_demand_quotation.TbDemandQuotationMapper;
+import com.pj.tb_demand_quotation.TbDemandQuotationService;
+import com.pj.tb_goods_demand.vo.GoodsDemandVo;
+import com.pj.tb_orders.TbOrders;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 03 16 49
+ **/
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class MethodGoodsDemandService {
+
+    @Autowired
+    private TbDemandQuotationMapper tbDemandQuotationMapper;
+    @Autowired
+    private LevelOneServerInterface levelOneServerInterface;
+    @Autowired
+    private TbGoodsDemandMapper tbGoodsDemandMapper;
+    @Autowired
+    private SmsRetryService smsRetryService;
+
+    /**
+     * 数据封装
+     * 将List<TbGoodsDemand>  封装成   List<GoodsDemandVo>
+     * @param list
+     * @return
+     */
+    public List<GoodsDemandVo> setGoodsDemandVo(List<TbGoodsDemand> list){
+        //创建返回值集合
+        List<GoodsDemandVo> resultList = new ArrayList<>();
+
+        //遍历集合
+        list.forEach(item -> {
+
+            //获取需求表ID
+            Long id = item.getId();
+            //查询报价表
+            LambdaQueryWrapper<TbDemandQuotation> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(TbDemandQuotation::getDemandId,id);
+            queryWrapper.eq(TbDemandQuotation::getDeleteStatus, DeleteStatus.DELETE_STATUS_ON.getCode());
+            List<TbDemandQuotation> tbDemandQuotations = tbDemandQuotationMapper.selectList(queryWrapper);
+            if(tbDemandQuotations.size() == 0)return;
+            //查询商品基本信息
+            TbDemandQuotation tbDemandQuotation = tbDemandQuotations.get(0);
+            GoodsDto goodsDto = levelOneServerInterface.getByGoodsId(item.getLevelOneGoodsId());
+            //开始封装数据
+            GoodsDemandVo goodsDemandVo = new GoodsDemandVo();
+            goodsDemandVo.setGoodsDemandId(id);
+            goodsDemandVo.setDemandQuotationId(tbDemandQuotation.getId());
+            goodsDemandVo.setGoodsImg(goodsDto.getAvatar());
+            goodsDemandVo.setGoodsName(goodsDto.getName());
+            goodsDemandVo.setGroupName(item.getGoodsName());
+            goodsDemandVo.setCreateName(tbDemandQuotation.getCreateName());
+            goodsDemandVo.setCreateTime(tbDemandQuotation.getCreateTime());
+            goodsDemandVo.setQuotation(tbDemandQuotation.getQuotation());
+            goodsDemandVo.setRemark(tbDemandQuotation.getRemark());
+            //执行添加
+            resultList.add(goodsDemandVo);
+
+        });
+
+        return resultList;
+    }
+
+    /**
+     * 执行同意处理
+     * @param goodsDemandId 需求表ID
+     * @param demandQuotationId  报价表ID
+     * @param disposeStatus 处理状态 1=确认,2=拒绝
+     */
+    public void agreeQuotation(Integer disposeStatus,Long goodsDemandId,Long demandQuotationId){
+        // 校验参数
+        TbDemandQuotation tbDemandQuotation = tbDemandQuotationMapper.selectById(demandQuotationId); // 报价
+        if(tbDemandQuotation == null)return;
+        TbGoodsDemand tbGoodsDemand = tbGoodsDemandMapper.selectById(goodsDemandId); //需求
+        if(tbGoodsDemand == null)return;
+        //执行过程
+        tbDemandQuotation.setQuotationResult(disposeStatus);
+        int updateById = tbDemandQuotationMapper.updateById(tbDemandQuotation);
+        if(updateById == 1){
+            //开始创建订单
+            TbOrders tbOrders = new TbOrders();
+            //设置订单基本属性
+            tbOrders.setGoodsId(tbGoodsDemand.getLevelOneGoodsId()); //一级市场海关允许销售商品表ID
+            tbOrders.setGoodsName(tbGoodsDemand.getGoodsName());
+//            tbOrders.setGoodsFrom();  //产地
+            tbOrders.setShipperPhone(tbDemandQuotation.getLinkPhone()); //联系电话
+            tbOrders.setShipperName(tbDemandQuotation.getCreateName()); //卖家名称
+
+
+
+        }
+
+    }
+                //  todo: ----------------
+    /**
+     * 执行拒绝处理
+     * @param goodsDemandId
+     * @param demandQuotationId
+     */
+    public void refuseQuotation(Long goodsDemandId,Long demandQuotationId) throws Exception {
+        // 校验参数
+        TbDemandQuotation tbDemandQuotation = tbDemandQuotationMapper.selectById(demandQuotationId);
+        if(tbDemandQuotation == null)return;
+        TbGoodsDemand tbGoodsDemand = tbGoodsDemandMapper.selectById(goodsDemandId);
+        if(tbGoodsDemand == null)return;
+        //执行过程
+
+
+
+    }
+}

+ 109 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemand.java

@@ -0,0 +1,109 @@
+package com.pj.tb_goods_demand;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.EqualsAndHashCode;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * Model: tb_goods_demand -- 二级收购商需求发布表
+ * @author yzs 
+ */
+@Data
+@Accessors(chain = true)
+@TableName(TbGoodsDemand.TABLE_NAME)
+@EqualsAndHashCode(callSuper = false)
+public class TbGoodsDemand extends Model<TbGoodsDemand> implements Serializable {
+
+	// ---------- 模块常量 ----------
+	/**
+	 * 序列化版本id 
+	 */
+	private static final long serialVersionUID = 1L;	
+	/**
+	 * 此模块对应的表名 
+	 */
+	public static final String TABLE_NAME = "tb_goods_demand";	
+	/**
+	 * 此模块对应的权限码 
+	 */
+	public static final String PERMISSION_CODE = "tb-goods-demand";
+	public static final String PERMISSION_CODE_ADD = "tb-goods-demand-add";
+	public static final String PERMISSION_CODE_EDIT = "tb-goods-demand-edit";
+	public static final String PERMISSION_CODE_DEL = "tb-goods-demand-del";
+
+
+
+
+	// ---------- 表中字段 ----------
+	/**
+	 * 二级市场商家需求发布表主键ID 
+	 */
+	@TableId(type = IdType.AUTO)
+	private Long id;	
+
+	/**
+	 * 一级市场海关允许售卖商品ID 
+	 */
+	private Long levelOneGoodsId;	
+
+	/**
+	 * 商品名称 
+	 */
+	private String goodsName;	
+
+	/**
+	 * 商品图片 
+	 */
+	private String goodsImg;	
+
+	/**
+	 * 二级市场商家ID 
+	 */
+	private Long purchaserId;	
+
+	/**
+	 * 商家名称 
+	 */
+	private String purchaserName;	
+
+	/**
+	 * 已被接单 
+	 */
+	private Integer isOrders;
+
+	/**
+	 * 商品量(根据海关允许发布表的计量单位决定,例如:柜,KG,吨) 
+	 */
+	private String goodsQuantity;	
+
+	/**
+	 * 商家备注 
+	 */
+	private String remark;	
+
+	/**
+	 * 创建时间 
+	 */
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date createTime;
+
+	/**
+	 * 删除状态 
+	 */
+	private Integer deleteStatus;
+
+
+
+
+
+	
+
+
+}

+ 87 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandController.java

@@ -0,0 +1,87 @@
+package com.pj.tb_goods_demand;
+
+import java.util.List;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import com.pj.utils.sg.*;
+import com.pj.project4sp.SP;
+
+import com.pj.current.satoken.StpUserUtil;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+
+/**
+ * Controller: tb_goods_demand -- 二级收购商需求发布表
+ * @author yzs 
+ */
+@RestController
+@RequestMapping("/TbGoodsDemand/")
+public class TbGoodsDemandController {
+
+	/** 底层 Service 对象 */
+	@Autowired
+	TbGoodsDemandService tbGoodsDemandService;
+
+	/** 增 */  
+	@RequestMapping("add")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_ADD)
+	public AjaxJson add(TbGoodsDemand t){
+		tbGoodsDemandService.add(t);
+		t = tbGoodsDemandService.getById(SP.publicMapper.getPrimarykey());
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 删 */  
+	@RequestMapping("delete")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_DEL)
+	public AjaxJson delete(Long id){
+		 tbGoodsDemandService.delete(id);
+		return AjaxJson.getSuccess();
+	}
+	
+	/** 删 - 根据id列表 */  
+	@RequestMapping("deleteByIds")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_DEL)
+	public AjaxJson deleteByIds(){
+		List<Long> ids = SoMap.getRequestSoMap().getListByComma("ids", long.class); 
+		int line = SP.publicMapper.deleteByIds(TbGoodsDemand.TABLE_NAME, ids);
+		return AjaxJson.getByLine(line);
+	}
+	
+	/** 改 */  
+	@RequestMapping("update")
+//	@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE_EDIT)
+	public AjaxJson update(TbGoodsDemand t){
+		tbGoodsDemandService.update(t);
+		return AjaxJson.getSuccess();
+	}
+
+	/** 查 - 根据id */  
+	@RequestMapping("getById")
+//		@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE)
+	public AjaxJson getById(Long id){
+		TbGoodsDemand t = tbGoodsDemandService.getById(id);
+		return AjaxJson.getSuccessData(t);
+	}
+
+	/** 查集合 - 根据条件(参数为空时代表忽略指定条件) */  
+	@RequestMapping("getList")
+//		@SaCheckPermission(TbGoodsDemand.PERMISSION_CODE)
+	public AjaxJson getList() { 
+		SoMap so = SoMap.getRequestSoMap();
+		List<TbGoodsDemand> list = tbGoodsDemandService.getList(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
+	
+	
+	
+	
+
+	
+	
+	
+
+}

+ 30 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandMapper.java

@@ -0,0 +1,30 @@
+package com.pj.tb_goods_demand;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.pj.utils.so.*;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Mapper: tb_goods_demand -- 二级收购商需求发布表
+ * @author yzs 
+ */
+
+@Mapper
+@Repository
+public interface TbGoodsDemandMapper extends BaseMapper <TbGoodsDemand> {
+
+
+
+	/**
+	 * 查集合 - 根据条件(参数为空时代表忽略指定条件)
+	 * @param so 参数集合 
+	 * @return 数据列表 
+	 */
+	List<TbGoodsDemand> getList(SoMap so);
+
+
+}

+ 63 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandMapper.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.pj.tb_goods_demand.TbGoodsDemandMapper">
+
+
+
+
+	<!-- ================================== 查询相关 ================================== -->
+	<!-- select id, level_one_goods_id, goods_name, goods_img, purchaser_id, purchaser_name, is_orders, goods_quantity, remark, create_time, delete_status from tb_goods_demand  -->
+	
+	<!-- 通用映射:自动模式 -->
+	<resultMap id="model" autoMapping="true" type="com.pj.tb_goods_demand.TbGoodsDemand"></resultMap>
+	
+	<!-- 公共查询sql片段 -->
+	<sql id="select_sql">
+		select * 
+		from tb_goods_demand 
+	</sql>
+
+	
+	<!-- 查集合 - 根据条件(参数为空时代表忽略指定条件) [G] -->
+	<select id="getList" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.has("id") '> and id = #{id} </if>
+			<if test=' this.has("levelOneGoodsId") '> and level_one_goods_id = #{levelOneGoodsId} </if>
+			<if test=' this.has("goodsName") '> and goods_name = #{goodsName} </if>
+			<if test=' this.has("goodsImg") '> and goods_img = #{goodsImg} </if>
+			<if test=' this.has("purchaserId") '> and purchaser_id = #{purchaserId} </if>
+			<if test=' this.has("purchaserName") '> and purchaser_name = #{purchaserName} </if>
+			<if test=' this.has("isOrders") '> and is_orders = #{isOrders} </if>
+			<if test=' this.has("goodsQuantity") '> and goods_quantity = #{goodsQuantity} </if>
+			<if test=' this.has("remark") '> and remark = #{remark} </if>
+			<if test=' this.has("createTime") '> and create_time = #{createTime} </if>
+			<if test=' this.has("deleteStatus") '> and delete_status = #{deleteStatus} </if>
+		</where>
+		order by
+		<choose>
+			<when test='sortType == 1'> id desc </when>
+			<when test='sortType == 2'> level_one_goods_id desc </when>
+			<when test='sortType == 3'> goods_name desc </when>
+			<when test='sortType == 4'> goods_img desc </when>
+			<when test='sortType == 5'> purchaser_id desc </when>
+			<when test='sortType == 6'> purchaser_name desc </when>
+			<when test='sortType == 7'> is_orders desc </when>
+			<when test='sortType == 8'> goods_quantity desc </when>
+			<when test='sortType == 9'> remark desc </when>
+			<when test='sortType == 10'> create_time desc </when>
+			<when test='sortType == 11'> delete_status desc </when>
+			<otherwise> id desc </otherwise>
+		</choose>
+	</select>
+	
+	
+	
+	
+	
+	
+	
+	
+	
+
+</mapper>

+ 109 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandService.java

@@ -0,0 +1,109 @@
+package com.pj.tb_goods_demand;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.pj.common.core.exception.ServiceException;
+import com.pj.current.dto.APPLoginUserInfo;
+import com.pj.current.satoken.StpAPPUserUtil;
+import com.pj.enummj.DeleteStatus;
+import com.pj.tb_goods_demand.vo.GoodsDemandVo;
+import com.pj.utils.so.SoMap;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+import com.pj.utils.sg.*;
+
+/**
+ * Service: tb_goods_demand -- 二级收购商需求发布表
+ * @author yzs 
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class TbGoodsDemandService extends ServiceImpl<TbGoodsDemandMapper, TbGoodsDemand> implements IService<TbGoodsDemand>{
+
+	/** 底层 Mapper 对象 */
+	@Autowired
+	TbGoodsDemandMapper tbGoodsDemandMapper;
+
+	@Autowired
+	private MethodGoodsDemandService methodGoodsDemandService;
+
+	/** 增 */
+	void add(TbGoodsDemand t){
+		save(t);
+	}
+
+	/** 删 */
+	void delete(Long id){
+		removeById(id);
+	}
+
+	/** 改 */
+	void update(TbGoodsDemand t){
+		updateById(t);
+
+	}
+
+	/** 查 */
+	TbGoodsDemand getById(Long id){
+		return super.getById(id);
+	}
+
+	/** pc端:专供给一级市场查看的需求列表 */
+	List<TbGoodsDemand> getList(SoMap so) {
+		return tbGoodsDemandMapper.getList(so);
+	}
+
+	/** app端:专供给一级市场查看的需求列表 */
+	List<TbGoodsDemand> getAppList(SoMap so,Integer isOrders) {
+		so.set("is_orders",isOrders);
+		so.set("sortType",10); //根据日期降序
+		so.set("delete_status", DeleteStatus.DELETE_STATUS_ON.getCode()); // 状态可用
+		return tbGoodsDemandMapper.getList(so);	
+	}
+
+	/**
+	 * 二级收购商查看当前已被报价的需求列表
+	 * @param isOrders
+	 * @return
+	 */
+	public List<GoodsDemandVo> goodsDemandList(SoMap so,Integer isOrders){
+		//获取并判断当前登陆人
+		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
+		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
+			throw new ServiceException("当前登录账号信息已失效!");
+		//匹配已被报价的列表
+		so.set("purchaserId",appLoginInfo.getFk());
+		so.set("isOrders",isOrders);
+		so.set("deleteStatus",DeleteStatus.DELETE_STATUS_ON.getCode());
+		List<TbGoodsDemand> goodsDemandMapperList = tbGoodsDemandMapper.getList(so);
+		if(goodsDemandMapperList.size() != 0){
+			List<GoodsDemandVo> goodsDemandVos = methodGoodsDemandService.setGoodsDemandVo(goodsDemandMapperList);
+			return goodsDemandVos;
+		}
+		return null;
+	}
+
+	/**
+	 * 二级市场收购商处理需求订单
+	 * @param disposeStatus 处理状态[0=待处理,1=通过,2=拒绝]
+	 * @param goodsDemandId  需求表主键
+	 * @param demandQuotationId 报价表主键
+	 */
+	public void disposeOrders(Integer disposeStatus,Long goodsDemandId,Long demandQuotationId)  {
+		//获取并判断当前登陆人
+		APPLoginUserInfo appLoginInfo = StpAPPUserUtil.getAPPLoginInfo();
+		if(appLoginInfo == null || appLoginInfo.getLoginId() == null)
+			throw new ServiceException("当前登录账号信息已失效!");
+		//同意则开始创建订单,不同意则修改报价表和需求表状态
+
+		methodGoodsDemandService.agreeQuotation(disposeStatus,goodsDemandId,demandQuotationId);
+
+
+	}
+
+}

+ 27 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/TbGoodsDemandUtil.java

@@ -0,0 +1,27 @@
+package com.pj.tb_goods_demand;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 工具类:tb_goods_demand -- 二级收购商需求发布表
+ * @author yzs 
+ *
+ */
+@Component
+public class TbGoodsDemandUtil {
+
+	
+	/** 底层 Mapper 对象 */
+	public static TbGoodsDemandMapper tbGoodsDemandMapper;
+	@Autowired
+	private void setTbGoodsDemandMapper(TbGoodsDemandMapper tbGoodsDemandMapper) {
+		TbGoodsDemandUtil.tbGoodsDemandMapper = tbGoodsDemandMapper;
+	}
+	
+
+
+	
+	
+	
+}

+ 61 - 0
sp-service/level-two-server/src/main/java/com/pj/tb_goods_demand/vo/GoodsDemandVo.java

@@ -0,0 +1,61 @@
+package com.pj.tb_goods_demand.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 08 03 16 27
+ **/
+@Data
+@NoArgsConstructor
+public class GoodsDemandVo {
+
+    /**
+     * 需求表主键
+     */
+    private Long goodsDemandId;
+
+    /**
+     * 报价表主键
+     */
+    private Long demandQuotationId;
+
+    /**
+     * 边民组ID
+     */
+    private Long groupId;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 商品图片
+     */
+    private String goodsImg;
+    /**
+     *  报价的组名
+     */
+    private String groupName;
+    /**
+     * 报价的组长名
+     */
+    private String createName;
+    /**
+     * 报价的时间
+     */
+    private Date createTime;
+    /**
+     * 价格
+     */
+    private Double quotation;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 2 - 2
sp-service/sp-admin/src/main/java/com/pj/project/app_user/AppUser.java

@@ -60,12 +60,12 @@ public class AppUser extends Model<AppUser> implements Serializable {
 	/**
 	 * 类型(1=边民,2=组长,3=商户,4=收购商,5=司机) 
 	 */
-	private String userType;	
+	private Integer userType;
 
 	/**
 	 * 外联id,user_type=1=>边民ID;user_type=3=>商户ID 
 	 */
-	private String fkId;	
+	private Long fkId;
 
 	/**
 	 * 状态(0=禁用,1=启用) 

+ 1 - 1
sp-service/sp-admin/src/main/java/com/pj/project/app_user/AppUserService.java

@@ -133,7 +133,7 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
 		//手机号
 		appUser.setPhone(phone);
 		//注册身份
-		appUser.setUserType(registerDto.getType().toString());
+		appUser.setUserType(registerDto.getType());
 		//加密并设置登陆密码
 		String password = registerDto.getPassword();
 		String encode = passwordEncoder.encode(password);

+ 2 - 1
sp-service/transport-server/src/main/java/com/pj/project/tb_driver/TbDriverController.java

@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.util.List;
 
 import com.pj.api.dto.DriverDto;
+import com.pj.enummj.DeleteStatus;
 import com.pj.utils.so.SoMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -74,7 +75,7 @@ public class TbDriverController {
 		@SaCheckPermission(TbDriver.PERMISSION_CODE)
 	public AjaxJson getList() { 
 		SoMap so = SoMap.getRequestSoMap();
-		so.set("deleteStatus", 1);
+		so.put("deleteStatus", DeleteStatus.DELETE_STATUS_ON.getCode());
 		List<TbDriver> list = tbDriverService.getList(so.startPage());
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}