TRX 1 vuosi sitten
vanhempi
commit
1c097ef5fe
15 muutettua tiedostoa jossa 751 lisäystä ja 5 poistoa
  1. 295 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ComplexModel.java
  2. 18 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/RegmerTypeModel.java
  3. 44 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/SignatureController.java
  4. 13 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/ComplexDao.java
  5. 14 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/PicDao.java
  6. 24 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/extend/ComplexDaoExtend.java
  7. 13 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/extend/PicDaoExtend.java
  8. 89 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/ComplexDaoImpl.java
  9. 34 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/PicDaoImpl.java
  10. 0 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/Complex.java
  11. 6 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserAccountServiceImpl.java
  12. 139 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/SignatureServiceImpl.java
  13. 29 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CustomBeanUtils.java
  14. 12 0
      FullCardServer/src/main/resources/application-dev.yml
  15. 21 0
      FullCardServer/src/main/resources/application-local.yml

+ 295 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ComplexModel.java

@@ -0,0 +1,295 @@
+package com.zhongshu.card.client.model.payment;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ComplexModel {
+
+    /**
+     * 平台用户id,对接平台方的用户id 。平台方自己定义,建议与自身用户ID绑定。 M
+     */
+    @Schema(description = "平台用户id,对接平台方的用户id 。平台方自己定义,建议与自身用户ID绑定")
+    private String accesser_user_id;
+
+    /**
+     * 注册类型,
+     * 00:企业商户
+     * 01:个人工商户
+     * 02:小微商户
+     * 03:机关事业单位或社会团体
+     * 05:民办非企业
+     * M
+     */
+    @Schema(description = "注册类型, 00:企业商户 01:个人工商户 02:小微商户 03:机关事业单位或社会团体 05:民办非企业 ")
+    private String reg_mer_type;
+
+    /**
+     * 法人身份证姓名 M
+     */
+    @Schema(description = "法人身份证姓名")
+    private String legal_name;
+
+
+    /**
+     * 法人身份证号  M
+     */
+    @Schema(description = "法人身份证号")
+    private String legal_idcard_no;
+
+    /**
+     * 法人手机号
+     */
+    @Schema(description = "法人手机号")
+    private String legal_mobile;
+
+    /**
+     * 法人邮箱 开通泛账户必传 c
+     */
+    @Schema(description = "法人邮箱 开通泛账户必传")
+    private String legal_email;
+
+    @Schema(description = "法人证件 开始时间")
+    private String legal_card_start;
+    /**
+     * 法人代表证件截止日期 yyyy-MM-dd
+     * 长期:9999-12-31(需要满46岁)
+     */
+    @Schema(description = "法人代表证件截止日期 ")
+    private String legal_card_deadline;
+
+    /**
+     * 法人性别
+     * 0-未知的性别
+     * 1-男性
+     * 2-女性
+     * 5-女性改(变)为男性    6-男性改(变)为女性    9-未说明的性别
+     * 企业类型为小微商户时必填,参数按国际标准传
+     */
+    @Schema(description = "法人性别 0-未知的性别 1-男性 2-女性 5-女性改(变)为男性 6-男性改(变)为女性 9-未说明的性别 企业类型为小微商户时必填,参数按国际标准传 ")
+    private String legal_sex;
+
+    /**
+     * 法人职业,企业类型为小微商户时必填
+     * 0-各类专业、技术人员
+     * 1-国家机关、党群组织、企事业单位的负责人
+     * 2-办事人员和有关人员
+     * 3-商业工作人员
+     * 4-服务性工作人员
+     * 5-农林牧渔劳动者
+     * 6-生产工作、运输工作和部分体力劳动者
+     * 7-不便分类的其他劳动者
+     */
+    @Schema(description = "法人职业,企业类型为小微商户时必填 0-各类专业、技术人员 1-国家机关、党群组织、企事业单位的负责人 2-办事人员和有关人员 3-商业工作人员 4-服务性工作人员 5-农林牧渔劳动者 6-生产工作、运输工作和部分体力劳动者 7-不便分类的其他劳动者")
+    private String legal_occupation;
+
+    /**
+     * 法人职业详细描述 legal_occupation为7-不便分类的其他劳动者时必填
+     */
+    @Schema(description = "法人职业详细描述 legal_occupation为7-不便分类的其他劳动者时必填")
+    private String legalmanCareerDesc;
+
+    /**
+     * 法人家庭住址
+     */
+    @Schema(description = "法人家庭住址")
+    private String legalmanHomeAddr;
+
+    /**
+     * 商户营业名称 M
+     */
+    @Schema(description = "商户营业名称 ")
+    private String shop_name;
+
+    /**
+     * 开户行行号 (所属支行查询接口返回) M
+     */
+
+    @Schema(description = "开户行行号 ")
+    private String bank_no;
+
+    /**
+     * 账户类型 '0:个人账户  1:公司账户' M
+     */
+    @Schema(description = "账户类型 '0:个人账户 1:公司账户")
+    private String bank_acct_type;
+
+    /**
+     * 开户行帐号
+     */
+    @Schema(description = "开户行帐号")
+    private String bank_acct_no;
+
+    /**
+     * 开户帐号名称
+     * 对公账户填写公司名称,需与营业执照名称保持一致
+     * 个人账户填写法人姓名
+     */
+    @Schema(description = "开户帐号名称 ")
+    private String bank_acct_name;
+
+    @Schema(description = "开户省 ")
+    private String bank_province_id;
+
+    @Schema(description = "开户市 ")
+    private String bank_city_id;
+
+    @Schema(description = "对公打款验证")
+    private Boolean verification;
+
+    @Schema(description = "发起对公验证时间")
+    private Long verificationTime;
+
+    @Schema(description = "验证次数")
+    private Integer verificationNo;
+
+    /**
+     * 营业省份id 3.13接口查询返回 M
+     */
+    @Schema(description = "营业省份id")
+    private String shop_province_id;
+
+    @Schema(description = "营业市id")
+    private String shop_city_id;
+
+    @Schema(description = "营业区id")
+    private String shop_country_id;
+
+    @Schema(description = "营业地址补充信息")
+    private String shop_addr_ext;
+
+    /**
+     * 社会信用统一代码/营业执照号
+     * 00:企业商户(必填)
+     * 01:个人工商户(必填)
+     * 02:小微商户(选填)
+     * 03:机关事业单位或社会团体(必填)
+     */
+    @Schema(description = "社会信用统一代码/营业执照号,\n " +
+            "    * 社会信用统一代码/营业执照号\n" +
+            "     * 00:企业商户(必填)\n" +
+            "     * 01:个人工商户(必填)\n" +
+            "     * 02:小微商户(选填)\n" +
+            "     * 03:机关事业单位或社会团体(必填)")
+    private String shop_lic;
+
+    @Schema(description = "行业类别编码 ,自助签约提供字典")
+    private String mccCode;
+
+    /**
+     * 申请开通业务
+     * product_id;
+     * 0-银联卡(1)
+     * 1-全民付(86)
+     * 2-POS通(68)
+     * 4-营销联盟(40)
+     * 8-公共支付-通用(9)
+     * 16-代付业务(74)
+     * 21-统一会员卡(37)
+     * in1-APP支付(in1)
+     * in2-H5支付(in2)
+     * in3-公众号支付(in3)
+     * in4-小程序支付(in4)
+     * receipt2Line 是否开通收支双线
+     */
+    @Schema(description = "申请开通业务")
+    private String product;
+
+
+    @Schema(description = "控股股东姓名")
+    private String shareholderName;
+
+    @Schema(description = "控股股东证件号")
+    private String shareholderCertno;
+
+    @Schema(description = "控股股东证件有效期")
+    private String shareholderCertExpire;
+
+    @Schema(description = "开始时间")
+    private String shareholderCertBeginDate;
+
+    @Schema(description = "* 控股股东证件证件类型\n" +
+            "     * 不填默认为身份证(1):\n" +
+            "     * 1、身份证\n" +
+            "     * 2、护照\n" +
+            "     * 3、军官证\n" +
+            "     * 4、警官证\n" +
+            "     * 5、士兵证\n" +
+            "     * 6、台湾居民来往大陆通行证\n" +
+            "     * 7、回乡证\n" +
+            "     * 8、港澳居民来往内地通行证\n" +
+            "     * 10、港澳台居民居住证\n" +
+            "     * 11、营业执照\n" +
+            "     * 12、组织机构代码证\n" +
+            "     * 13、税务登记证\n" +
+            "     * 14、商业登记证\n" +
+            "     * 15、民办非企业登记证书\n" +
+            "     * 16、批文证明")
+    private String shareholderCertType;
+
+    @Schema(description = "控股股东家庭住址 商户类型为非小微,且控股股东非法人时必填")
+    private String shareholderHomeAddr;
+
+    @Schema(description = "商户传真")
+    private String fax;
+
+    @Schema(description = "终端维护经理")
+    private String lastTerminalManager;
+
+    @Schema(description = "客户维护经理")
+    private String lastClientManager;
+
+    @Schema(description = "所属服务区域")
+    private String serviceDistrict;
+
+    @Schema(description = "细分服务区域")
+    private String detailDistrict;
+
+    @Schema(description = "发展部门")
+    private String developingDept;
+
+
+    @Schema(description = "发展人或账号")
+    private String developingPersonID;
+
+    @Schema(description = "受益人信息")
+    private List<BnfModel> bnfList;
+
+    @Schema(description = "二维码id列表 最多7个,每个为26位数字,用英文逗号隔开")
+    private String ums_qrcode_list;
+
+    @Schema(description = "商户类型,0-实体商户,1-网络商户, 2-实体兼线上")
+    private String mchntType;
+
+    @Schema(description = "商户对外名称")
+    private String externalName;
+
+    @Schema(description = "是否连锁")
+    private String isChain;
+
+    @Schema(description = "图片列表")
+    private List<PicUpModel> pic_list;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "签约是否完成")
+    private boolean finish;
+
+    @Schema(description = "签约状态信息")
+    private String apply_status_msg;
+
+    @Schema(description = "签约状态码")
+    private String apply_status;
+
+    @Schema(description = "签约流水号")
+    private String ums_reg_id;
+
+
+}

+ 18 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/RegmerTypeModel.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.client.model.payment;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.Pattern;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class RegmerTypeModel extends BaseModel {
+
+    @Pattern(regexp = "^(00|01|02|03|05)$")
+    @Schema(description = "00:企业商户 01:个人工商户 02:小微商户 03:机关事业单位或社会团体 05:民办非企业")
+    private String reg_mer_type;
+}

+ 44 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/SignatureController.java

@@ -1,8 +1,52 @@
 package com.zhongshu.card.server.core.controller.payment;
 
+import com.github.microservice.auth.client.constant.AuthConstant;
+import com.github.microservice.auth.client.content.ResultContent;
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.payment.BaseModel;
+import com.zhongshu.card.client.model.payment.ComplexModel;
+import com.zhongshu.card.client.model.payment.RegmerTypeModel;
+import com.zhongshu.card.server.core.service.payment.SignatureServiceImpl;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
 /**
  * @author TRX
  * @date 2024/6/19
  */
+@RestController
+@RequestMapping("/school/signature")
+@Tag(name = "学校-账户管理")
 public class SignatureController {
+    @Autowired
+    SignatureServiceImpl signatureService;
+
+
+    @Operation(summary = "查询正在进行的签约流程")
+    @ResourceAuth(value = AuthConstant.SuperAdmin, type = AuthType.Platform)
+    @ResourceAuth(value = "admin", type = AuthType.Enterprise)
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @RequestMapping(value = "complexIng", method = RequestMethod.POST)
+    public ResultContent<ComplexModel> complexIng(@Valid @RequestBody BaseModel baseModel) {
+        return signatureService.complexIng(baseModel);
+    }
+
+    @Operation(description = "变更或者发起流程", summary = "变更或者发起流程")
+    @RequestMapping(value = "startComplex", method = RequestMethod.POST)
+    @ResourceAuth(value = AuthConstant.SuperAdmin, type = AuthType.Platform)
+    @ResourceAuth(value = "admin", type = AuthType.Enterprise)
+    @ResourceAuth(value = "user", type = AuthType.User)
+    public ResultContent startComplex(@Valid @RequestBody RegmerTypeModel reg_mer_type) {
+
+        return signatureService.startComplex(reg_mer_type);
+    }
+
 }

+ 13 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/ComplexDao.java

@@ -0,0 +1,13 @@
+package com.zhongshu.card.server.core.dao.payment;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.payment.extend.ComplexDaoExtend;
+import com.zhongshu.card.server.core.domain.payment.Complex;
+
+import java.util.List;
+
+public interface ComplexDao extends MongoDao<Complex> , ComplexDaoExtend {
+
+    List<Complex> findAllByEpId(String epId);
+
+}

+ 14 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/PicDao.java

@@ -0,0 +1,14 @@
+package com.zhongshu.card.server.core.dao.payment;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.payment.extend.PicDaoExtend;
+import com.zhongshu.card.server.core.domain.payment.Pic;
+
+import java.util.List;
+
+public interface PicDao extends MongoDao<Pic> , PicDaoExtend {
+
+    void deleteByAccesserId(String accesserId);
+
+    List<Pic> findAllByAccesserId(String accesserId);
+}

+ 24 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/extend/ComplexDaoExtend.java

@@ -0,0 +1,24 @@
+package com.zhongshu.card.server.core.dao.payment.extend;
+
+import com.zhongshu.card.server.core.domain.payment.Complex;
+import org.bson.Document;
+
+import java.util.List;
+
+public interface ComplexDaoExtend {
+
+    Complex findByAccesser_user_id(String epId);
+
+    Complex findByAccesser_user_idAndEpId(String accesseId, String epId);
+
+
+    void deleteByAccesser_user_id(String epId);
+
+    List<Complex> findAllFinish(String epId);
+
+
+    List<Document> findAllFinish();
+
+    List<Complex> findCommit();
+
+}

+ 13 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/extend/PicDaoExtend.java

@@ -0,0 +1,13 @@
+package com.zhongshu.card.server.core.dao.payment.extend;
+
+import com.zhongshu.card.server.core.domain.payment.Pic;
+
+import java.util.List;
+
+public interface PicDaoExtend {
+
+    Pic findByAccesserIdAndDocument_type(String accesserId, String type);
+
+    List<Pic> findByEpId(String epId);
+
+}

+ 89 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/ComplexDaoImpl.java

@@ -0,0 +1,89 @@
+package com.zhongshu.card.server.core.dao.payment.impl;
+
+import com.zhongshu.card.server.core.dao.payment.extend.ComplexDaoExtend;
+import com.zhongshu.card.server.core.domain.payment.Complex;
+import org.bson.Document;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.List;
+
+public class ComplexDaoImpl implements ComplexDaoExtend {
+
+    @Autowired
+    MongoTemplate mongoTemplate;
+
+    @Override
+    public Complex findByAccesser_user_id(String epId) {
+
+        Query query = new Query(Criteria.where("accesser_user_id").is(epId));
+
+        List<Complex> complexes = mongoTemplate.find(query, Complex.class);
+        if (complexes.size() == 0) {
+
+
+            return null;
+        }
+        return mongoTemplate.find(query, Complex.class).get(0);
+
+    }
+
+    @Override
+    public Complex findByAccesser_user_idAndEpId(String accesseId, String epId) {
+
+        Query query = new Query(Criteria.where("accesser_user_id").is(accesseId).and("epId").is(epId));
+
+        List<Complex> complexes = mongoTemplate.find(query, Complex.class);
+        if (complexes.size() == 0) {
+
+
+            return null;
+        }
+        return mongoTemplate.find(query, Complex.class).get(0);
+    }
+
+    @Override
+    public void deleteByAccesser_user_id(String epId) {
+        Query query = new Query(Criteria.where("accesser_user_id").is(epId));
+
+        mongoTemplate.remove(query, Complex.class);
+
+    }
+
+    @Override
+    public List<Complex> findAllFinish(String epId) {
+        Criteria criteria = Criteria.where("mer_no").ne(null).and("epId").is(epId);
+        Query query = new Query(criteria);
+        return mongoTemplate.find(query, Complex.class);
+    }
+
+    @Override
+    public List<Document> findAllFinish() {
+        Criteria criteria = Criteria.where("mer_no").ne(null);
+
+        Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),
+                Aggregation.group("accesser_user_id")
+                        .first("shop_name").as("shop_name")
+                        .first("accesser_user_id").as("accesser_user_id")
+                        .first("externalName").as("externalName")
+                        .first("mer_no").as("mer_no")
+        );
+
+
+        return mongoTemplate.aggregate(aggregation, "complex", Document.class).getMappedResults();
+    }
+
+
+    @Override
+    public List<Complex> findCommit() {
+        Criteria criteria = Criteria.where("ums_reg_id").ne(null);
+        criteria.and("apply_status").is("02");
+        Query query = new Query(criteria);
+
+        return mongoTemplate.find(query, Complex.class);
+
+    }
+}

+ 34 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/PicDaoImpl.java

@@ -0,0 +1,34 @@
+package com.zhongshu.card.server.core.dao.payment.impl;
+
+import com.zhongshu.card.server.core.dao.payment.extend.PicDaoExtend;
+import com.zhongshu.card.server.core.domain.payment.Pic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.List;
+
+public class PicDaoImpl implements PicDaoExtend {
+
+    @Autowired
+    MongoTemplate mongoTemplate;
+
+    @Override
+    public Pic findByAccesserIdAndDocument_type(String accesserId, String type) {
+
+        Query query = new Query(Criteria.where("document_type").is(type).and("accesserId").is(accesserId));
+
+        List<Pic> pics = mongoTemplate.find(query, Pic.class);
+        if (pics.size() == 0) {
+            return null;
+        }
+        return pics.get(0);
+    }
+
+    @Override
+    public List<Pic> findByEpId(String epId) {
+        Query query = new Query(Criteria.where("epId").is(epId));
+        return mongoTemplate.find(query, Pic.class);
+    }
+}

+ 0 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/Complex.java

@@ -361,5 +361,4 @@ public class Complex extends SuperMain {
 
     private Boolean copy;
 
-
 }

+ 6 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserAccountServiceImpl.java

@@ -27,10 +27,7 @@ import com.zhongshu.card.server.core.domain.org.*;
 import com.zhongshu.card.server.core.domain.school.DictInfo;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.school.DictInfoServiceImpl;
-import com.zhongshu.card.server.core.util.BeanUtils;
-import com.zhongshu.card.server.core.util.CommonUtil;
-import com.zhongshu.card.server.core.util.DateUtils;
-import com.zhongshu.card.server.core.util.ValidateUtils;
+import com.zhongshu.card.server.core.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -137,6 +134,11 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
             temp = userCountDao.findTopByLoginName(loginName);
             if (ObjectUtils.isEmpty(temp)) {
                 String password = param.getPassWord();
+                // 验证密码
+                ValidateResult validateResult = ValidateUtils.validatePassWord(password);
+                if (!validateResult.isSuccess()) {
+                    return ResultContent.buildFail(validateResult.getMsg());
+                }
                 if (StringUtils.isEmpty(password)) {
                     password = CardDefault.DEFAULT_PASSWORD;
                 }

+ 139 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/SignatureServiceImpl.java

@@ -1,11 +1,150 @@
 package com.zhongshu.card.server.core.service.payment;
 
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.github.microservice.auth.client.content.ResultContent;
+import com.github.microservice.auth.client.content.ResultState;
+import com.zhongshu.card.client.model.dahua.PicUploadRequestModel;
+import com.zhongshu.card.client.model.dahua.PicUploadResponseModel;
+import com.zhongshu.card.client.model.payment.BaseModel;
+import com.zhongshu.card.client.model.payment.ComplexModel;
+import com.zhongshu.card.client.model.payment.PicUpModel;
+import com.zhongshu.card.client.model.payment.RegmerTypeModel;
 import com.zhongshu.card.client.service.payment.SignatureService;
+import com.zhongshu.card.client.utils.type.payment.PicType;
+import com.zhongshu.card.server.core.dao.payment.ComplexDao;
+import com.zhongshu.card.server.core.dao.payment.PicDao;
+import com.zhongshu.card.server.core.domain.payment.Complex;
+import com.zhongshu.card.server.core.domain.payment.Pic;
 import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.util.CustomBeanUtils;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
 
 /**
  * @author TRX
  * @date 2024/6/19
  */
+@Slf4j
+@Service
 public class SignatureServiceImpl extends SuperService implements SignatureService {
+
+    @Autowired
+    PicDao picDao;
+
+    @Autowired
+    ComplexDao complexDao;
+
+    @Transactional
+    public ResultContent<Complex> startComplex(RegmerTypeModel typeModel) {
+        String accesseId = typeModel.getAccesseId();
+        if (ObjectUtil.isEmpty(accesseId)) {
+            return ResultContent.build(ResultState.Success, newComplex(typeModel));
+        }
+        Complex complex = findComplex(typeModel);
+        if (ObjectUtil.isEmpty(complex) || !complex.getReg_mer_type().equals(typeModel.getReg_mer_type())) {
+            picDao.deleteByAccesserId(accesseId);
+            complexDao.deleteByAccesser_user_id(accesseId);
+
+            return ResultContent.build(ResultState.Success, newComplex(typeModel));
+        }
+        return ResultContent.build(ResultState.Success, complex);
+    }
+
+    /**
+     * 查询正在进行的流程
+     *
+     * @return
+     */
+    public ResultContent<ComplexModel> complexIng(BaseModel baseModel) {
+        String accesseId = baseModel.getAccesseId();
+
+        Complex complex = findComplex(baseModel);
+        ArrayList<PicUpModel> picUpModels = new ArrayList<>();
+
+        picDao.findAllByAccesserId(accesseId).forEach(it -> {
+            PicUpModel picUpModel = new PicUpModel();
+            CustomBeanUtils.copyPropertiesIgnoreNull(it, picUpModel);
+            picUpModels.add(picUpModel);
+        });
+
+        ComplexModel complexModel = new ComplexModel();
+        CustomBeanUtils.copyPropertiesIgnoreNull(complex, complexModel);
+        complexModel.setPic_list(picUpModels);
+        return ResultContent.build(ResultState.Success, complexModel);
+    }
+
+    /**
+     * 上传图片
+     *
+     * @param picUpModel
+     * @return
+     */
+    public ResultContent picUpload(PicUpModel picUpModel) {
+        String accesseId = picUpModel.getAccesseId();
+        String base64 = imageToBase64(picUpModel.getFileUrl());
+
+        PicUploadRequestModel picUploadModel = new PicUploadRequestModel();
+        picUploadModel.setPic_base64(base64);
+        PicUploadResponseModel picUploadResponseModel = null;
+//        PicUploadResponseModel picUploadResponseModel = daHuaApi.picUpload(picUploadModel);
+        PicType picType = picUpModel.getPicType();
+        Pic pic = picDao.findByAccesserIdAndDocument_type(accesseId, picType.getDocument_type());
+        if (ObjectUtil.isEmpty(pic)) {
+
+            Pic newPic = new Pic();
+            CustomBeanUtils.copyPropertiesIgnoreNull(picUploadResponseModel, newPic);
+            CustomBeanUtils.copyPropertiesIgnoreNull(picUpModel, newPic);
+            newPic.setEpId(picUpModel.getOid());
+            newPic.setAccesserId(accesseId);
+            newPic.setDocument_type(picType.getDocument_type());
+            newPic.setDocument_name(picType.getName());
+            picDao.save(newPic);
+            return ResultContent.build(ResultState.Success);
+        } else {
+//            pic.setEpId(pic.getEpId());
+//            pic.setAccesserId(accesseId);
+            CustomBeanUtils.copyPropertiesIgnoreNull(picUploadResponseModel, pic);
+            CustomBeanUtils.copyPropertiesIgnoreNull(picUpModel, pic);
+            picDao.save(pic);
+            return ResultContent.build(ResultState.Success);
+        }
+    }
+
+    private Complex findComplex(BaseModel baseModel) {
+        Complex complex = complexDao.findByAccesser_user_idAndEpId(baseModel.getAccesseId(), baseModel.getOid());
+        Assert.isTrue(null != complex, "申请流程不存在");
+        return complex;
+    }
+
+    private Complex newComplex(RegmerTypeModel typeModel) {
+        String newAccesseId = IdUtil.fastSimpleUUID();
+        Complex newComplex = new Complex();
+        newComplex.setEpId(typeModel.getOid());
+        newComplex.setAccesser_user_id(newAccesseId);
+        newComplex.setReg_mer_type(typeModel.getReg_mer_type());
+        return complexDao.save(newComplex);
+    }
+
+    @SneakyThrows
+    private String imageToBase64(String urlIm) {
+        String imgType = urlIm.substring(urlIm.lastIndexOf(".") + 1, urlIm.length());
+        URL url = new URL(urlIm);
+        InputStream inputStream = url.openStream();
+        byte[] bytes = IoUtil.readBytes(inputStream);
+        String imgBase64Head = "data:image/" + imgType + ";base64,";
+        String body = Base64.encode(bytes);
+        return imgBase64Head + body;
+    }
+
 }

+ 29 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CustomBeanUtils.java

@@ -0,0 +1,29 @@
+package com.zhongshu.card.server.core.util;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
+
+import java.beans.PropertyDescriptor;
+import java.util.HashSet;
+import java.util.Set;
+
+public class CustomBeanUtils {
+    public static void copyPropertiesIgnoreNull(Object source, Object target) {
+        BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
+    }
+
+    private static String[] getNullPropertyNames(Object source) {
+        final BeanWrapper src = new BeanWrapperImpl(source);
+        PropertyDescriptor[] pds = src.getPropertyDescriptors();
+        Set<String> emptyNames = new HashSet<>();
+        for (PropertyDescriptor pd : pds) {
+            Object srcValue = src.getPropertyValue(pd.getName());
+            if (srcValue == null) {
+                emptyNames.add(pd.getName());
+            }
+        }
+        String[] result = new String[emptyNames.size()];
+        return emptyNames.toArray(result);
+    }
+}

+ 12 - 0
FullCardServer/src/main/resources/application-dev.yml

@@ -35,6 +35,18 @@ oAuth:
   clientId: test
   clientSecret: 123456
 
+# 阿里云OSS
+oss:
+  maxCacheMinutes: 10
+  maxCacheCount: 100
+  _other:
+    host: https://oss.dev.zonelife.cn/
+  _type: ALiObjectStorage
+  endpoint: oss-cn-chengdu.aliyuncs.com
+  bucket: zswl-dev
+  accessKeyId: LTAI5tCvJccdHK17R4kYrLgy
+  accessKeySecret: Vbt3NiZfi6f47vU8QcfqQIsjiFo6vH
+  arn: acs:ram::1540890773231210:role/oss
 
 #logging:
 #  level:

+ 21 - 0
FullCardServer/src/main/resources/application-local.yml

@@ -22,6 +22,15 @@ spring:
           min-idle: 8   # 最小空闲连接
           max-wait: 100ms # 连接等待时间
 
+# c端的小程序配置 (学生端)
+cwechat:
+  appid: wx3be1d6d84d46cdf7
+  secret: 4401df45d409cbf28560e87c4c21b4bf
+
+# 商户端的小程序配置
+swechat:
+  appid: wx3be1d6d84d46cdf7
+  secret: 4401df45d409cbf28560e87c4c21b4bf
 
 springdoc:
   api-docs:
@@ -35,6 +44,18 @@ oAuth:
   clientId: test
   clientSecret: 123456
 
+# 阿里云OSS
+oss:
+  maxCacheMinutes: 10
+  maxCacheCount: 100
+  _other:
+    host: https://oss.dev.zonelife.cn/
+  _type: ALiObjectStorage
+  endpoint: oss-cn-chengdu.aliyuncs.com
+  bucket: zswl-dev
+  accessKeyId: LTAI5tCvJccdHK17R4kYrLgy
+  accessKeySecret: Vbt3NiZfi6f47vU8QcfqQIsjiFo6vH
+  arn: acs:ram::1540890773231210:role/oss
 
 #logging:
 #  level: