Sfoglia il codice sorgente

财务管理相关接口开发
联调问题修复
暂时注释定时任务

marxjaw 3 mesi fa
parent
commit
3704fd9611
25 ha cambiato i file con 630 aggiunte e 25 eliminazioni
  1. 1 1
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/YtAppUserServiceImpl.java
  2. 2 2
      yt-agent/agent-service/src/main/resources/mapper/MessageMapper.xml
  3. 6 0
      yt-common/src/main/java/com/ytpm/general/RepMessage.java
  4. 5 0
      yt-common/src/main/java/com/ytpm/middle/model/YtMiddleEnterprise.java
  5. 34 0
      yt-common/src/main/java/com/ytpm/middle/param/ConfirmReceiveParam.java
  6. 28 0
      yt-common/src/main/java/com/ytpm/middle/param/PaymentListParam.java
  7. 30 0
      yt-common/src/main/java/com/ytpm/middle/view/FinancePaymentItemVO.java
  8. 48 0
      yt-common/src/main/java/com/ytpm/middle/view/FinancePaymentVO.java
  9. 2 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/MiddleApplication.java
  10. 25 2
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/controller/FinanceController.java
  11. 3 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/AttachMapper.java
  12. 2 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/EnterpriseMapper.java
  13. 32 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/FinanceMapper.java
  14. 18 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/FinanceService.java
  15. 24 7
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/AgentServiceImpl.java
  16. 14 1
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/AppServiceImpl.java
  17. 130 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/FinanceServiceImpl.java
  18. 0 1
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/MessageServiceImpl.java
  19. 37 0
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/timer/CustomScheduling.java
  20. 1 0
      yt-middle/middle-platform/src/main/resources/mapper/ApkMapper.xml
  21. 1 1
      yt-middle/middle-platform/src/main/resources/mapper/AppMapper.xml
  22. 28 0
      yt-middle/middle-platform/src/main/resources/mapper/AttachMapper.xml
  23. 14 0
      yt-middle/middle-platform/src/main/resources/mapper/EnterpriseMapper.xml
  24. 133 0
      yt-middle/middle-platform/src/main/resources/mapper/FinanceMapper.xml
  25. 12 10
      yt-middle/middle-platform/src/main/resources/mapper/MessageMapper.xml

+ 1 - 1
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/YtAppUserServiceImpl.java

@@ -184,7 +184,7 @@ public class YtAppUserServiceImpl implements YtAppUserService {
         //群发需查询除我以外的该消息未读记录,如不存在则我为最后一个需要修改主类已读状态
         List<MessageRecordVO> vos =  messageMapper.queryUnreadRecord(messageId,userId);
         if(CollUtil.isNotEmpty(vos)) {
-            Result.resultOk(RepMessage.MODIFY_SUCCESS);
+           return Result.resultOk(RepMessage.MODIFY_SUCCESS);
         }
         modifyMessageStatus(messageId,userId);
         return Result.resultOk(RepMessage.MODIFY_SUCCESS);

+ 2 - 2
yt-agent/agent-service/src/main/resources/mapper/MessageMapper.xml

@@ -7,7 +7,7 @@
             pm.message_type,
             pm.message_title,
             pm.message_content,
-            pm.message_status,
+            pmr.recipient_status messageStatus,
             pm.send_time,
             pm.send_type,
             pm.create_time,
@@ -16,7 +16,7 @@
             pm.update_user_id,
             pm.available
         from yt_platform_message_record pmr
-                 join yt_platform_message pm on pmr.message_id = pm.message_id
+        join yt_platform_message pm on pmr.message_id = pm.message_id
         where pmr.recipient = #{userId}
     </select>
 

+ 6 - 0
yt-common/src/main/java/com/ytpm/general/RepMessage.java

@@ -17,6 +17,7 @@ public class RepMessage {
     public static final String LOCK_USER_SUCCESS = "用户锁定成功";
     public static final String RESET_SUCCESS = "重置成功";
     public static final String GRANT_SUCCESS = "授权成功";
+    public static final String CONFIRM_SUCCESS = "确认成功";
 
     public static final String NOT_LOGIN= "当前用户未登录";
     public static final String USER_NAME_EMPTY = "用户名不能为空";
@@ -30,12 +31,17 @@ public class RepMessage {
     public static final String OBJECT_ALREADY_EXIST = "查询对象已存在";
 
     public static final String COLLECTION_EMPTY = "集合数据不能为空";
+    public static final String PAYMENT_ATTACH_EMPTY = "缴费凭证不能为空";
     public static final String USER_STATUS_MODIFY = "用户状态已改变";
     public static final String ALREADY_RISK_USER = "用户已被风控";
     public static final String RELATIVE_APP_SUCCESS = "关联应用成功";
     public static final String SERVICE_UNAVAILABLE = "服务暂时不可用,请稍后重试";
     public static final String OBJECT_NOT_EXIST = "查询对象不存在";
+    public static final String PAYMENT_NOT_EXIST = "缴费信息不存在";
     public static final String CURRENT_USER_RISKING = "当前用户处于风控中";
     public static final String NOT_PERMIT = "当前用户无访问权限";
     public static final String WX_APP_ID_NOT_EMPTY = "请先绑定微信开放应用ID";
+
+
+    public static final String WAITING_PAYMENT = "等待财务确认收款";
 }

+ 5 - 0
yt-common/src/main/java/com/ytpm/middle/model/YtMiddleEnterprise.java

@@ -8,6 +8,9 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 @EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel("易推加盟企业信息表")
@@ -51,4 +54,6 @@ public class YtMiddleEnterprise extends BaseParam {
     private String takuPublicKey;
     @ApiModelProperty("是否加急")
     private int hasFast;
+    private Date paymentDate;
+    private BigDecimal sharingRatio;
 }

+ 34 - 0
yt-common/src/main/java/com/ytpm/middle/param/ConfirmReceiveParam.java

@@ -0,0 +1,34 @@
+package com.ytpm.middle.param;
+
+import com.ytpm.agent.model.YtPlatformAttach;
+import com.ytpm.agent.param.AttachParam;
+import com.ytpm.general.BaseParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Marx
+ * @date 2025/8/6 15:32
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("确认收款表单")
+public class ConfirmReceiveParam extends BaseParam {
+    @ApiModelProperty("缴费单ID")
+    private String paymentId;
+    @ApiModelProperty("出账结算日")
+    private Date paymentDate;
+    @ApiModelProperty("企业ID")
+    private String enterpriseId;
+    @ApiModelProperty("附件列表")
+    private List<AttachParam> attachList;
+}

+ 28 - 0
yt-common/src/main/java/com/ytpm/middle/param/PaymentListParam.java

@@ -0,0 +1,28 @@
+package com.ytpm.middle.param;
+
+import com.ytpm.general.BaseParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @author Marx
+ * @date 2025/8/6 14:36
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("缴费单表单")
+public class PaymentListParam extends BaseParam {
+    @ApiModelProperty("缴费单编号")
+    private String paymentNo;
+    @ApiModelProperty("缴费单状态")
+    private Integer paymentStatus;
+    @ApiModelProperty("企业合作类型")
+    private Integer enterpriseType;
+}

+ 30 - 0
yt-common/src/main/java/com/ytpm/middle/view/FinancePaymentItemVO.java

@@ -0,0 +1,30 @@
+package com.ytpm.middle.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Marx
+ * @date 2025/8/6 14:46
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("财务缴费单明细")
+public class FinancePaymentItemVO {
+    @ApiModelProperty("缴费项目ID")
+    private String itemId;
+    @ApiModelProperty("缴费项目名称")
+    private String itemName;
+    @ApiModelProperty("缴费项目单位")
+    private String unit;
+    @ApiModelProperty("缴费项目数量")
+    private Integer count;
+    @ApiModelProperty("缴费项目金额")
+    private BigDecimal itemAmount;
+}

+ 48 - 0
yt-common/src/main/java/com/ytpm/middle/view/FinancePaymentVO.java

@@ -0,0 +1,48 @@
+package com.ytpm.middle.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Marx
+ * @date 2025/8/6 14:32
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("财务缴费列表")
+public class FinancePaymentVO {
+    @ApiModelProperty("缴费单ID")
+    private String paymentId;
+    @ApiModelProperty("缴费单编号")
+    private String paymentNo;
+    @ApiModelProperty("总金额")
+    private BigDecimal totalAmount;
+    @ApiModelProperty("缴费状态")
+    private int paymentStatus;
+    @ApiModelProperty("企业ID")
+    private String enterpriseId;
+    @ApiModelProperty("企业名称")
+    private String enterpriseName;
+    @ApiModelProperty("信用代码")
+    private String creditCode;
+    @ApiModelProperty("企业合作类型")
+    private Integer enterpriseType;
+    @ApiModelProperty("是否加急")
+    private Integer hasFast;
+    @ApiModelProperty("分佣比例")
+    private BigDecimal sharingRatio;
+    @ApiModelProperty("出账核算日")
+    private Date paymentDate;
+    @ApiModelProperty("缴费项目列表")
+    private List<FinancePaymentItemVO> itemList;
+    @ApiModelProperty("打款凭证列表")
+    private List<AttachVO> attachList;
+}

+ 2 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/MiddleApplication.java

@@ -5,8 +5,10 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.web.bind.annotation.RestController;
 
+//@EnableScheduling
 @RestController
 @SpringBootApplication
 @EnableDiscoveryClient

+ 25 - 2
yt-middle/middle-platform/src/main/java/com/ytpm/middle/controller/FinanceController.java

@@ -2,8 +2,11 @@ package com.ytpm.middle.controller;
 
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
+import com.ytpm.middle.param.ConfirmReceiveParam;
 import com.ytpm.middle.param.PaymentItemParam;
+import com.ytpm.middle.param.PaymentListParam;
 import com.ytpm.middle.service.FinanceService;
+import com.ytpm.middle.view.FinancePaymentVO;
 import com.ytpm.middle.view.MiddleUserInfo;
 import com.ytpm.middle.view.PaymentItemVO;
 import io.swagger.annotations.Api;
@@ -32,8 +35,8 @@ public class FinanceController {
     private FinanceService financeService;
 
     @ApiOperation("查询缴费项目列表")
-    @PostMapping("/queryList")
-    public ResultTable<PaymentItemVO> queryList(@RequestBody PaymentItemParam param) {
+    @PostMapping("/queryItemList")
+    public ResultTable<PaymentItemVO> queryItemList(@RequestBody PaymentItemParam param) {
         return financeService.queryList(param);
     }
 
@@ -56,4 +59,24 @@ public class FinanceController {
     public Result<String> deleteItem(@RequestParam(name = "itemId")String itemId, @ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
         return financeService.delItem(itemId,userInfo.getUserId());
     }
+
+    @ApiOperation("缴费单列表")
+    @PostMapping("/paymentList")
+    public ResultTable<FinancePaymentVO> paymentList(@RequestBody PaymentListParam param) {
+        return financeService.paymentList(param);
+    }
+
+    @ApiOperation("查看缴费单明细")
+    @GetMapping("/paymentDetail")
+    public Result<FinancePaymentVO> paymentDetail(@RequestParam(name = "paymentId")String paymentId) {
+        return financeService.paymentDetail(paymentId);
+    }
+
+    @ApiOperation("确认收款")
+    @PostMapping("/confirmReceive")
+    public Result<String> confirmReceive(@RequestBody ConfirmReceiveParam param,@ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
+        param.setUpdateParam(userInfo.getUserId());
+        return financeService.confirmReceive(param);
+    }
+
 }

+ 3 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/AttachMapper.java

@@ -1,5 +1,6 @@
 package com.ytpm.middle.dao;
 
+import com.ytpm.agent.model.YtPlatformAttach;
 import com.ytpm.middle.view.AttachVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -9,4 +10,6 @@ import java.util.List;
 @Mapper
 public interface AttachMapper {
     List<AttachVO> queryByTargetId(@Param("targetId") String targetId,@Param("targetType") Integer targetType);
+
+    void batchInsert(@Param("dataList") List<YtPlatformAttach> dataList);
 }

+ 2 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/EnterpriseMapper.java

@@ -24,4 +24,6 @@ public interface EnterpriseMapper {
      * 统计入驻的企业数
      */
     int countEnterprise();
+
+    YtMiddleEnterprise selectPrimary(@Param("enterpriseId")String enterpriseId);
 }

+ 32 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/FinanceMapper.java

@@ -4,6 +4,9 @@ import com.ytpm.middle.model.YtFinancePayment;
 import com.ytpm.middle.model.YtFinancePaymentItem;
 import com.ytpm.middle.model.YtFinancePaymentRecord;
 import com.ytpm.middle.param.PaymentItemParam;
+import com.ytpm.middle.param.PaymentListParam;
+import com.ytpm.middle.view.FinancePaymentItemVO;
+import com.ytpm.middle.view.FinancePaymentVO;
 import com.ytpm.middle.view.PaymentItemVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -41,4 +44,33 @@ public interface FinanceMapper {
      * 新增缴费单
      */
     void addPayment(YtFinancePayment payment);
+    /**
+     * 修改缴费单
+     */
+    void updatePayment(YtFinancePayment payment);
+
+    /**
+     * 查询缴费单列表
+     */
+    List<FinancePaymentVO> paymentList(PaymentListParam param);
+
+    /**
+     * 查询缴费单详情
+     */
+    FinancePaymentVO getPaymentDetail(@Param("paymentId") String paymentId);
+
+    /**
+     * 修改缴费记录
+     */
+    void updatePaymentRecord(@Param("paymentId")String paymentId);
+
+    /**
+     * 根据缴费单类型查询企业用户缴费信息
+     */
+    FinancePaymentVO getPaymentByType(@Param("userId") String userId, @Param("type")int type);
+
+    /**
+     * 根据缴费项目ID查询缴费项目
+     */
+    List<FinancePaymentItemVO> findByItemIds(@Param("itemIdList") List<String> itemIdList);
 }

+ 18 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/FinanceService.java

@@ -2,7 +2,10 @@ package com.ytpm.middle.service;
 
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
+import com.ytpm.middle.param.ConfirmReceiveParam;
 import com.ytpm.middle.param.PaymentItemParam;
+import com.ytpm.middle.param.PaymentListParam;
+import com.ytpm.middle.view.FinancePaymentVO;
 import com.ytpm.middle.view.PaymentItemVO;
 
 public interface FinanceService {
@@ -23,4 +26,19 @@ public interface FinanceService {
      * 删除缴费项目
      */
     Result<String> delItem(String itemId, String userId);
+
+    /**
+     * 缴费单列表
+     */
+    ResultTable<FinancePaymentVO> paymentList(PaymentListParam param);
+
+    /**
+     * 缴费单明细
+     */
+    Result<FinancePaymentVO> paymentDetail(String paymentId);
+
+    /**
+     * 确认收款
+     */
+    Result<String> confirmReceive(ConfirmReceiveParam param);
 }

+ 24 - 7
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/AgentServiceImpl.java

@@ -24,6 +24,7 @@ import com.ytpm.middle.service.AgentService;
 import com.ytpm.middle.util.RedisUtil;
 import com.ytpm.middle.util.TencentSmsUtil;
 import com.ytpm.middle.view.AgentBaseInfoListVO;
+import com.ytpm.middle.view.FinancePaymentItemVO;
 import com.ytpm.oauth.model.YtPlatformUser;
 import com.ytpm.util.IDUtil;
 import com.ytpm.util.RandomPasswordGenerator;
@@ -36,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -65,6 +67,14 @@ public class AgentServiceImpl implements AgentService {
 
     @Value("${tencent.sms.resetTemplateId}")
     private String resetTemplateId;
+    @Value("${agent.app.amountItemId}")
+    private String agentAppAmountItemId;
+    @Value("${agent.app.softItemId}")
+    private String agentAppSoftItemId;
+    @Value("${agent.app.dataItemId}")
+    private String agentAppDataItemId;
+    @Value("${agent.app.softFastItemId}")
+    private String agentAppSoftFastItemId;
     /**
      * 渠道商基本信息列表
      */
@@ -112,31 +122,37 @@ public class AgentServiceImpl implements AgentService {
     private void generatePayment(AgentForm form, String accountId) {
         String paymentId = IDUtil.generateFlowID("bill_");
         BigDecimal totalAmount = BigDecimal.ZERO;
+        
+        List<FinancePaymentItemVO> vos = financeMapper.findByItemIds(Arrays.asList(agentAppAmountItemId,agentAppSoftItemId,agentAppDataItemId,agentAppSoftFastItemId));
+        Map<String, FinancePaymentItemVO> itemMap = vos.stream().collect(Collectors.toMap(s -> s.getItemId(), o -> o));
         //缴费单生产未缴费记录
         YtFinancePaymentRecord record = new YtFinancePaymentRecord();
         //加急或普通软著费
+        FinancePaymentItemVO vo = itemMap.get(form.getHasFast() == 1?agentAppSoftFastItemId:agentAppSoftItemId);
         record.setPaymentId(paymentId);
         record.setUserId(accountId);
-        record.setItemId(form.getHasFast()==1?"7c9607f7727911f0b74d525400b5f38e":"6d4c2561727911f0b74d525400b5f38e");
-        record.setShouldAmount(new BigDecimal(form.getHasFast()==1?1000:400));
+        record.setItemId(vo.getItemId());
+        record.setShouldAmount(vo.getItemAmount());
         record.setRecordId(IdUtil.fastSimpleUUID());
         financeMapper.addPaymentRecord(record);
         totalAmount = totalAmount.add(record.getShouldAmount());
         //1200流量费
+        vo = itemMap.get(agentAppDataItemId);
         record = new YtFinancePaymentRecord();
         record.setPaymentId(paymentId);
         record.setUserId(accountId);
-        record.setItemId("34b6eb3f727911f0b74d525400b5f38e");
-        record.setShouldAmount(new BigDecimal(1200));
+        record.setItemId(vo.getItemId());
+        record.setShouldAmount(vo.getItemAmount());
         record.setRecordId(IdUtil.fastSimpleUUID());
         financeMapper.addPaymentRecord(record);
         totalAmount = totalAmount.add(record.getShouldAmount());
-        //一万定金
+        //APP售价
+        vo = itemMap.get(agentAppAmountItemId);
         record = new YtFinancePaymentRecord();
         record.setPaymentId(paymentId);
         record.setUserId(accountId);
-        record.setItemId("26bc4fa9727911f0b74d525400b5f38e");
-        record.setShouldAmount(new BigDecimal(10000));
+        record.setItemId(vo.getItemId());
+        record.setShouldAmount(vo.getItemAmount());
         record.setRecordId(IdUtil.fastSimpleUUID());
         financeMapper.addPaymentRecord(record);
         totalAmount = totalAmount.add(record.getShouldAmount());
@@ -145,6 +161,7 @@ public class AgentServiceImpl implements AgentService {
         payment.setPaymentId(paymentId);
         payment.setPaymentNo(redisUtil.generateOrderNo("payment_"));
         payment.setTotalAmount(totalAmount);
+        payment.setPaymentType(1);
         payment.setUserId(accountId);
         payment.setDefaultParam(form.getCreateUserId());
         financeMapper.addPayment(payment);

+ 14 - 1
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/AppServiceImpl.java

@@ -9,6 +9,7 @@ import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import com.ytpm.middle.dao.AppMapper;
 import com.ytpm.middle.dao.EnterpriseMapper;
+import com.ytpm.middle.dao.FinanceMapper;
 import com.ytpm.middle.model.YtAppGrantRecord;
 import com.ytpm.middle.model.YtMiddleEnterprise;
 import com.ytpm.middle.param.AppForm;
@@ -17,8 +18,10 @@ import com.ytpm.middle.param.GrantAppParam;
 import com.ytpm.middle.service.AppService;
 import com.ytpm.middle.view.AppListVO;
 import com.ytpm.middle.view.DropDownVO;
+import com.ytpm.middle.view.FinancePaymentVO;
 import com.ytpm.util.IDUtil;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -33,6 +36,8 @@ public class AppServiceImpl implements AppService {
     private AppMapper appMapper;
     @Resource
     private EnterpriseMapper enterpriseMapper;
+    @Autowired
+    private FinanceMapper financeMapper;
 
     /**
      *  应用列表
@@ -81,7 +86,15 @@ public class AppServiceImpl implements AppService {
         if(Objects.isNull(enterprise)){
             return Result.resultErr(RepMessage.OBJECT_NOT_EXIST);
         }
-        //目前先线下确认企业打款凭证
+        //查询企业用户定金缴费单是否缴费完成
+        FinancePaymentVO vo = financeMapper.getPaymentByType(enterprise.getUserId(),1);
+        if(Objects.isNull(vo)){
+            return Result.resultErr(RepMessage.PAYMENT_NOT_EXIST);
+        }
+        if(0 == vo.getPaymentStatus()){
+            return Result.resultErr(RepMessage.WAITING_PAYMENT);
+        }
+        //校验微信登录设置
         YtPlatformUserApp appInfo =  appMapper.getByPrimary(param.getAppId());
         if(Objects.isNull(appInfo)|| StrUtil.isBlank(appInfo.getWxAppId())){
             return Result.resultErr(RepMessage.WX_APP_ID_NOT_EMPTY);

+ 130 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/FinanceServiceImpl.java

@@ -1,20 +1,44 @@
 package com.ytpm.middle.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.ytpm.agent.model.YtPlatformAttach;
+import com.ytpm.agent.param.AttachParam;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.dao.AgentMapper;
+import com.ytpm.middle.dao.AttachMapper;
+import com.ytpm.middle.dao.EnterpriseMapper;
 import com.ytpm.middle.dao.FinanceMapper;
+import com.ytpm.middle.model.YtFinancePayment;
 import com.ytpm.middle.model.YtFinancePaymentItem;
+import com.ytpm.middle.model.YtMiddleEnterprise;
+import com.ytpm.middle.param.ConfirmReceiveParam;
 import com.ytpm.middle.param.PaymentItemParam;
+import com.ytpm.middle.param.PaymentListParam;
 import com.ytpm.middle.service.FinanceService;
+import com.ytpm.middle.util.RedisUtil;
+import com.ytpm.middle.util.TencentSmsUtil;
+import com.ytpm.middle.view.FinancePaymentVO;
 import com.ytpm.middle.view.PaymentItemVO;
 import com.ytpm.util.IDUtil;
+import com.ytpm.util.RandomPasswordGenerator;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -26,6 +50,20 @@ public class FinanceServiceImpl implements FinanceService {
 
     @Resource
     private FinanceMapper financeMapper;
+    @Resource
+    private EnterpriseMapper enterpriseMapper;
+    @Resource
+    private AgentMapper agentMapper;
+    @Resource
+    private AttachMapper attachMapper;
+
+    @Resource
+    private RedisUtil redisUtil;
+    @Resource
+    private TencentSmsUtil smsUtil;
+
+    @Value("${tencent.sms.registryTemplateId}")
+    private String registryTemplateId;
 
     /**
      * 查询缴费项目列表
@@ -79,4 +117,96 @@ public class FinanceServiceImpl implements FinanceService {
         financeMapper.updateItem(item);
         return Result.resultOk(RepMessage.DELETE_SUCCESS);
     }
+
+    /**
+     * 缴费单列表
+     */
+    @Override
+    public ResultTable<FinancePaymentVO> paymentList(PaymentListParam param) {
+        PageHelper.startPage(param.getPage(), param.getLimit());
+        return ResultTable.resultTableOk(new PageInfo<>(financeMapper.paymentList(param)));
+    }
+
+    /**
+     * 缴费单明细
+     */
+    @Override
+    public Result<FinancePaymentVO> paymentDetail(String paymentId) {
+        return Result.resultObjOk(financeMapper.getPaymentDetail(paymentId));
+    }
+
+    /**
+     * 确认收款
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result<String> confirmReceive(ConfirmReceiveParam param) {
+        FinancePaymentVO detail = financeMapper.getPaymentDetail(param.getPaymentId());
+        if(Objects.isNull(detail)){
+            return Result.resultErr(RepMessage.OBJECT_NOT_EXIST);
+        }
+        if(CollUtil.isEmpty(param.getAttachList())){
+            return Result.resultErr(RepMessage.PAYMENT_ATTACH_EMPTY);
+        }
+        changePaymentInfo(param);
+        changeEnterpriseInfo(param);
+        return Result.resultObjOk(RepMessage.CONFIRM_SUCCESS);
+    }
+
+    /**
+     * 修改企业用户缴费单信息
+     */
+    private void changePaymentInfo(ConfirmReceiveParam param) {
+        //修改缴费单状态、收款金额等
+        YtFinancePayment payment = new YtFinancePayment();
+        payment.setPaymentId(param.getPaymentId());
+        payment.setPaymentStatus(1);
+        payment.setFinishTime(new Date());
+        payment.setUpdateParam(param.getUpdateUserId());
+        financeMapper.updatePayment(payment);
+        financeMapper.updatePaymentRecord(payment.getPaymentId());
+        //增加缴费凭证信息
+        List<YtPlatformAttach> dataList = new ArrayList<>();
+        YtPlatformAttach attach;
+        for (AttachParam attachParam : param.getAttachList()) {
+            attach = new YtPlatformAttach();
+            BeanUtils.copyProperties(attachParam, attach);
+            attach.setTargetType(2);
+            attach.setTargetId(payment.getPaymentId());
+            attach.setUploadTime(new Date());
+            attach.setAttachId(IdUtil.getSnowflakeNextIdStr());
+            attach.setUploadUserId(param.getCreateUserId());
+            dataList.add(attach);
+        }
+        attachMapper.batchInsert(dataList);
+    }
+
+    /**
+     * 设置企业信息,并推送短信给客户
+     */
+    private void changeEnterpriseInfo(ConfirmReceiveParam param) {
+        //设置企业的分成比例和出账日
+        YtMiddleEnterprise old = enterpriseMapper.selectPrimary(param.getEnterpriseId());
+        if(Objects.nonNull(old)){
+            YtMiddleEnterprise enterprise = new YtMiddleEnterprise();
+            enterprise.setEnterpriseId(old.getEnterpriseId());
+            enterprise.setPaymentDate(param.getPaymentDate());
+            enterprise.setSharingRatio(new BigDecimal(50));
+            enterpriseMapper.updateById(enterprise);
+        }
+        //取出redis缓存的企业用户负责人手机号对应的密码,短信发送
+        String pwd = "";
+        if(Boolean.TRUE.equals(redisUtil.hasKey(old.getConcatPhone()))){
+            pwd = redisUtil.getStr(old.getConcatPhone());
+        }else {
+            pwd = RandomPasswordGenerator.generatePassword(8);
+            agentMapper.resetPwd(old.getUserId(),new BCryptPasswordEncoder().encode(pwd));
+        }
+        try {
+            smsUtil.sendLoginPwd(old.getConcatPhone(), pwd,registryTemplateId);
+            redisUtil.del(old.getConcatPhone());
+        } catch (TencentCloudSDKException e) {
+            throw new CustomerException(e.getMessage());
+        }
+    }
 }

+ 0 - 1
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/MessageServiceImpl.java

@@ -47,7 +47,6 @@ public class MessageServiceImpl implements MessageService {
 
         if(CollUtil.isNotEmpty(recipientList)){
             YtPlatformMessageRecord record = new YtPlatformMessageRecord();
-            record.setRecordId(IDUtil.generateFlowID("sendMsg"));
             record.setMessageId(message.getMessageId());
             record.setRecipient(String.join(",", recipientList));
             record.setRecipientStatus(0);

+ 37 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/timer/CustomScheduling.java

@@ -0,0 +1,37 @@
+package com.ytpm.middle.timer;
+
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+
+/**
+ * @author Marx
+ * @date 2025/8/6 18:02
+ */
+//@Component
+public class CustomScheduling {
+
+    /**
+     * 每周三执行
+     */
+//    @Scheduled(cron = "0 0 0 ? * WED")
+//    public void financialAccounting() {
+//        LocalDate today = LocalDate.now();
+//        // 1. 获取本月最后一个周三
+//        LocalDate lastWed = today.with(TemporalAdjusters.lastInMonth(DayOfWeek.WEDNESDAY));
+//        // 2. 判断今天是否是最后一个周三
+//        if (today.isEqual(lastWed)) {
+//            executeFinanceTask();
+//        }
+//    }
+//
+//    /**
+//     * 执行任务,查询需要出账的企业
+//     */
+//    private void executeFinanceTask() {
+//
+//    }
+}

+ 1 - 0
yt-middle/middle-platform/src/main/resources/mapper/ApkMapper.xml

@@ -49,6 +49,7 @@
         </where>
         GROUP BY
         ya.app_id
+        ORDER BY ya.apk_url
     </select>
     <select id="countApk" resultType="java.lang.Integer">
         select

+ 1 - 1
yt-middle/middle-platform/src/main/resources/mapper/AppMapper.xml

@@ -49,7 +49,7 @@
          data_charge,
          grant_time,
          operator_id,
-         operator_time
+         operate_time
         )
         values
         (

+ 28 - 0
yt-middle/middle-platform/src/main/resources/mapper/AttachMapper.xml

@@ -8,4 +8,32 @@
         from yt_platform_attach
         where target_type = #{targetType} and target_id = #{targetId}
     </select>
+
+    <insert id="batchInsert">
+        insert into yt_platform_attach
+        (
+        attach_id,
+        attach_name,
+        url,
+        size,
+        target_type,
+        target_id,
+        upload_time,
+        upload_user_id
+        )
+        values
+        <foreach collection="dataList" separator="," item="item">
+            (
+            #{item.attachId},
+            #{item.attachName},
+            #{item.url},
+            #{item.size},
+            #{item.targetType},
+            #{item.targetId},
+            #{item.uploadTime},
+            #{item.uploadUserId}
+            )
+        </foreach>
+
+    </insert>
 </mapper>

+ 14 - 0
yt-middle/middle-platform/src/main/resources/mapper/EnterpriseMapper.xml

@@ -15,6 +15,7 @@
              business_licence,
              registry_address,
              taku_public_key,
+             has_fast,
              create_time,
              create_user_id,
              available
@@ -31,6 +32,7 @@
              #{businessLicence},
              #{registryAddress},
              #{takuPublicKey},
+             #{hasFast},
              #{createTime},
              #{createUserId},
              #{available}
@@ -72,6 +74,12 @@
             <if test="takuPublicKey != null">
                 taku_public_key = #{takuPublicKey},
             </if>
+            <if test="paymentDate != null">
+                payment_date = #{paymentDate},
+            </if>
+            <if test="sharingRatio != null">
+                sharing_ratio = #{sharingRatio},
+            </if>
             <if test="available != null">
                 available = #{available}
             </if>
@@ -91,4 +99,10 @@
         from yt_middle_enterprise
         where available = 1
     </select>
+    <select id="selectPrimary" resultType="com.ytpm.middle.model.YtMiddleEnterprise">
+        select
+            enterprise_id, user_id, enterprise_name, enterprise_type, credit_code, legal, legal_card, concat_phone, business_licence, registry_address, logo, has_fast, sharing_ratio, payment_date, create_time, create_user_id, update_time, update_user_id, available, taku_public_key
+        from yt_middle_enterprise
+        where enterprise_id = #{enterpriseId}
+    </select>
 </mapper>

+ 133 - 0
yt-middle/middle-platform/src/main/resources/mapper/FinanceMapper.xml

@@ -76,6 +76,44 @@
         </set>
         where item_id = #{itemId}
     </update>
+    <update id="updatePayment">
+        update yt_finance_payment
+        <set>
+            <if test="paymentNo != null">
+                payment_no = #{paymentNo},
+            </if>
+            <if test="paymentType != null">
+                payment_type = #{paymentType},
+            </if>
+            <if test="paymentStatus != null">
+                payment_status = #{paymentStatus},
+            </if>
+            <if test="totalAmount != null">
+                total_amount = #{totalAmount},
+            </if>
+            <if test="userId != null">
+                user_id = #{userId},
+            </if>
+            <if test="finishTime != null">
+                finish_time = #{finishTime},
+            </if>
+            <if test="updateTime != null">
+                update_time = #{updateTime},
+            </if>
+            <if test="updateUserId != null">
+                update_user_id = #{updateUserId},
+            </if>
+            <if test="available != null">
+                available = #{available}
+            </if>
+        </set>
+        where payment_id = #{paymentId}
+    </update>
+    <update id="updatePaymentRecord">
+        update yt_finance_payment_record
+        set receive_amount = should_amount, receive_time = now(),charge_status=1
+        where payment_id = #{paymentId}
+    </update>
 
     <select id="queryList" resultType="com.ytpm.middle.view.PaymentItemVO">
         select
@@ -92,4 +130,99 @@
         from yt_finance_payment_item
         where item_id = #{itemId}
     </select>
+    <select id="paymentList" resultType="com.ytpm.middle.view.FinancePaymentVO">
+        SELECT
+            fp.payment_id,
+            fp.payment_no,
+            fp.total_amount,
+            fp.payment_status,
+            me.enterprise_id,
+            me.enterprise_name,
+            me.credit_code,
+            me.enterprise_type,
+            me.sharing_ratio,
+            me.has_fast
+        FROM
+            yt_finance_payment fp
+            JOIN yt_middle_enterprise me ON fp.user_id = me.user_id
+        WHERE
+            fp.available = 1
+        <if test="paymentNo != null and paymentNo != ''">
+            and fp.payment_no like concat('%',#{paymentNo},'%')
+        </if>
+        <if test="paymentStatus != null">
+            and fp.payment_status = #{paymentStatus}
+        </if>
+        <if test="enterpriseType != null">
+            and me.enterprise_type = #{enterpriseType}
+        </if>
+        order by fp.payment_status
+    </select>
+    <resultMap id="FinancePaymentVOMap" type="com.ytpm.middle.view.FinancePaymentVO">
+        <id column="payment_id" property="paymentId" />
+        <result column="payment_no" property="paymentNo" />
+        <result column="total_amount" property="totalAmount" />
+        <result column="payment_status" property="paymentStatus" />
+        <result column="enterprise_name" property="enterpriseName" />
+        <result column="credit_code" property="creditCode" />
+        <result column="enterprise_type" property="enterpriseType" />
+        <result column="has_fast" property="hasFast" />
+        <result column="sharing_ratio" property="sharingRatio" />
+        <result column="payment_date" property="paymentDate" />
+        <collection property="itemList" ofType="com.ytpm.middle.view.FinancePaymentItemVO">
+            <result column="item_id" property="itemId" />
+            <result column="item_name" property="itemName" />
+            <result column="item_amount" property="itemAmount" />
+        </collection>
+        <collection property="attachList" ofType="com.ytpm.middle.view.AttachVO">
+            <result column="attach_id" property="attachId" />
+            <result column="url" property="url" />
+            <result column="size" property="size" />
+            <result column="attach_name" property="attachName" />
+        </collection>
+    </resultMap>
+    <select id="getPaymentDetail" resultMap="FinancePaymentVOMap">
+        SELECT
+            fp.payment_id,
+            fp.payment_no,
+            fp.total_amount,
+            fp.payment_status,
+            me.enterprise_name,
+            me.credit_code,
+            me.enterprise_type,
+            me.has_fast,
+            me.sharing_ratio,
+            me.payment_date,
+            fpr.item_id,
+            (select item_name from yt_finance_payment_item where item_id = fpr.item_id) item_name,
+            (select item_amount from yt_finance_payment_item where item_id = fpr.item_id) item_amount,
+            pa.attach_id,
+            pa.attach_name,
+            pa.url,
+            pa.size
+        FROM
+            yt_finance_payment fp
+            JOIN yt_middle_enterprise me ON fp.user_id = me.user_id
+            LEFT JOIN yt_finance_payment_record fpr ON fp.payment_id = fpr.payment_id
+            LEFT JOIN yt_platform_attach pa on target_type = 2 and target_id = fp.payment_id
+        WHERE
+            fp.available = 1
+        and fp.payment_id = #{paymentId}
+        group by fp.payment_id,fpr.record_id,pa.attach_id
+    </select>
+    <select id="getPaymentByType" resultType="com.ytpm.middle.view.FinancePaymentVO">
+        select
+            payment_id, payment_no, payment_type, total_amount, payment_status, user_id, finish_time, create_time, create_user_id, update_time, update_user_id, available
+        from yt_finance_payment
+        where payment_type = 1 and user_id = #{userId}
+    </select>
+    <select id="findByItemIds" resultType="com.ytpm.middle.view.FinancePaymentItemVO">
+        select
+            item_id, item_name, item_amount, unit, count, create_time, create_user_id, update_time, update_user_id, available
+        from yt_finance_payment_item
+        where item_id in
+        <foreach collection="itemIdList" separator="," item="item" open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 12 - 10
yt-middle/middle-platform/src/main/resources/mapper/MessageMapper.xml

@@ -43,16 +43,18 @@
          available
         )
         values
-        (
-          #{recordId},
-          #{messageId},
-          #{recipient},
-          #{recipientStatus},
-          #{recipientTime},
-          #{createUserId},
-          #{createTime},
-          #{available}
-        );
+        <foreach collection="recipient.split(',')" separator="," item="item">
+           (
+            replace(uuid(),'-',''),
+            #{messageId},
+            #{item},
+            #{recipientStatus},
+            #{recipientTime},
+            #{createUserId},
+            #{createTime},
+            #{available}
+           )
+        </foreach>
     </insert>
     <update id="updateByPrimaryKeySelective">
         update yt_platform_message