Bladeren bron

协议接口修改

liweifan 3 jaren geleden
bovenliggende
commit
6cfbf18ec8

+ 1 - 1
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java

@@ -100,7 +100,7 @@ public class SysUser implements Serializable{
 	@ApiModelProperty(value = "用户角色")
 	private List<Long> roles;
 
-	private String certificateType;
+	private String certificateType = "IDENTITY";
 
 	public String getCertificateType() {
 		return certificateType;

+ 1 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -222,7 +222,7 @@ public class TokenController extends BaseController {
             QRLoginDto dto = (QRLoginDto) data;
             return HttpResponseResult.succeed(dto);
         } else {
-            return HttpResponseResult.succeed("二维码已过期");
+            return HttpResponseResult.succeed(null, "二维码已过期");
         }
     }
 

+ 1 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -65,6 +65,7 @@
         VALUES(#{isSuperAdmin},#{imToken},#{id},#{username},#{salt},#{phone},#{avatar},now(),now(),#{wxOpenid},#{qqOpenid},#{userType},
         #{gender},#{nation},#{birthdate},#{email},#{idCardNo},#{wechatId},#{realName},#{certificateType})
     </insert>
+
     <insert id="saveTeacher">
         INSERT INTO teacher (user_id_,create_time_,update_time_)VALUES(#{userId},NOW(),NOW())
     </insert>

+ 2 - 2
cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/HttpResponseResult.java

@@ -30,8 +30,8 @@ public class HttpResponseResult<T> extends BaseResult<T> {
         return getResponseData(true, HttpStatus.OK, null, "");
     }
 
-    public static <T> HttpResponseResult<T> succeed(String message) {
-        return getResponseData(true, HttpStatus.OK, null, message);
+    public static <T> HttpResponseResult<T> succeed(T object, String message) {
+        return getResponseData(true, HttpStatus.OK, object, message);
     }
 
     public static <T> HttpResponseResult<T> warned(String message) {

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/DealStatusEnum.java

@@ -11,7 +11,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum DealStatusEnum implements BaseEnum<String, DealStatusEnum> {
     DOING("处理中"),
-    SCCESS("成功"),
+    SUCCESS("成功"),
     FAILED("失败");
     @EnumValue
     private String code;

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ContractService.java

@@ -13,5 +13,8 @@ public interface ContractService {
 
 	@Async
 	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
-	HttpResponseResult<String> transferProduceContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType, Boolean isShowVisualSeal);
+	HttpResponseResult<String> transferProduceContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType);
+
+	@Transactional(isolation = Isolation.READ_COMMITTED)
+	HttpResponseResult<String> queryProductContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType);
 }

+ 90 - 23
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ContractServiceImpl.java

@@ -24,7 +24,6 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
@@ -78,7 +77,7 @@ public class ContractServiceImpl implements ContractService {
     @Override
     @Async
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRES_NEW)
-    public HttpResponseResult<String> transferProduceContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType, Boolean isShowVisualSeal) {
+    public HttpResponseResult<String> transferProduceContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType) {
         SysUser user = sysUserService.findUserById(userId);
         if (user == null) {
             logger.error("用户不存在({})", userId);
@@ -114,14 +113,14 @@ public class ContractServiceImpl implements ContractService {
         FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
         templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
 
-        Boolean signflag = contractRecordService.checkContractSign(userId,userType, contractType);
+        Boolean signflag = contractRecordService.checkContractSign(userId, userType, contractType);
         if (signflag) {
             return HttpResponseResult.failed("用户已经签署协议");
         }
 
         // 查询最新协议模板
         ContractTemplate tenantContractTemplate = contractTemplateService.queryLatestContractTemplate(contractType);
-        if(tenantContractTemplate == null){
+        if (tenantContractTemplate == null) {
             logger.error("最新协议模板查询失败");
             return HttpResponseResult.failed("最新协议模板查询失败");
         }
@@ -129,23 +128,23 @@ public class ContractServiceImpl implements ContractService {
 
         Map<String, Object> params = new HashMap<>();
         String companyName = sysConfigService.findConfigValue(SysConfigConstant.COMPANY_NAME);
-        params.put("companyName",companyName);
-        params.put("companySealPicture",sysConfigService.findConfigValue(SysConfigConstant.COMPANY_SEAL_PICTURE));
-        params.put("contractMainContent",mainContent);
-        params.put("isShowVisualSeal", isShowVisualSeal);
+        params.put("companyName", companyName);
+        params.put("companySealPicture", sysConfigService.findConfigValue(SysConfigConstant.COMPANY_SEAL_PICTURE));
+        params.put("contractMainContent", mainContent);
+        params.put("isShowVisualSeal", false);
 
 
-        Map<String,Object> userInfo = new HashMap<>();
-        userInfo.put("realName",user.getRealName());
-        userInfo.put("phone",user.getPhone());
-        userInfo.put("idCardNo",user.getIdCardNo());
+        Map<String, Object> userInfo = new HashMap<>();
+        userInfo.put("realName", user.getRealName());
+        userInfo.put("phone", user.getPhone());
+        userInfo.put("idCardNo", user.getIdCardNo());
 
-        if(SysUserType.STUDENT.equals(userType)){
+        if (SysUserType.STUDENT.equals(userType)) {
             StudentVo detail = studentService.detail(userId);
-            userInfo.put("subjectName",detail.getSubjectName());
-        }else if(SysUserType.TEACHER.equals(userType)){
+            userInfo.put("subjectName", detail.getSubjectName());
+        } else if (SysUserType.TEACHER.equals(userType)) {
             TeacherVo detail = teacherService.detail(userId);
-            userInfo.put("subjectName",detail.getSubjectName());
+            userInfo.put("subjectName", detail.getSubjectName());
         }
         params.put("userInfo", userInfo);
 
@@ -163,7 +162,7 @@ public class ContractServiceImpl implements ContractService {
         SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
         if (organTsign == null) {
             //创建企业签章
-            addTsign(0L, organCode, companyName);
+            organTsign = addTsign(0L, organCode, companyName);
         }
 
         eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
@@ -179,10 +178,79 @@ public class ContractServiceImpl implements ContractService {
         return HttpResponseResult.succeed(pdfFilePath);
     }
 
+    @Override
+    @Transactional(isolation = Isolation.READ_COMMITTED)
+    public HttpResponseResult<String> queryProductContract(Long userId, SysUserType userType, ContractTemplateTypeEnum contractType) {
+        Map<String, Object> result = new HashMap<>();
+        result.put("code", "false");
+
+        SysUser user = sysUserService.findUserById(userId);
+        if (user == null) {
+            return HttpResponseResult.failed("用户不存在");
+        }
+
+        if (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCardNo())) {
+            return HttpResponseResult.failed("身份信息缺失");
+        }
+
+        Date date = new Date();
+
+        // 合成freemarker
+        String srcPdfPath = contractBaseDir + "/product/" + dateFormat1.format(date) + "/" + userId + "_" + LocalDateTime.now().getSecond() + ".pdf";
+
+        File srcFile = new File(srcPdfPath);
+
+        File debtFile = new File(srcFile.getParent());
+        if (!debtFile.exists()) {
+            debtFile.mkdirs();
+        }
+
+        FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+        templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+        // 查询最新协议模板
+        ContractTemplate tenantContractTemplate = contractTemplateService.queryLatestContractTemplate(contractType);
+        if (tenantContractTemplate == null) {
+            return HttpResponseResult.failed("最新协议模板查询失败");
+        }
+        String mainContent = tenantContractTemplate.getContractTemplateContent();
+
+        Map<String, Object> params = new HashMap<>();
+        String companyName = sysConfigService.findConfigValue(SysConfigConstant.COMPANY_NAME);
+        params.put("companyName", companyName);
+        params.put("companySealPicture", sysConfigService.findConfigValue(SysConfigConstant.COMPANY_SEAL_PICTURE));
+        params.put("contractMainContent", mainContent);
+        params.put("isShowVisualSeal", true);
+
+
+        Map<String, Object> userInfo = new HashMap<>();
+        userInfo.put("realName", user.getRealName());
+        userInfo.put("phone", user.getPhone());
+        userInfo.put("idCardNo", user.getIdCardNo());
 
+        if (SysUserType.STUDENT.equals(userType)) {
+            StudentVo detail = studentService.detail(userId);
+            userInfo.put("subjectName", detail.getSubjectName());
+        } else if (SysUserType.TEACHER.equals(userType)) {
+            TeacherVo detail = teacherService.detail(userId);
+            userInfo.put("subjectName", detail.getSubjectName());
+        }
+        params.put("userInfo", userInfo);
+        templateEngine.render(params, "latest_contract_template.ftl", srcFile);
+
+        String html = "";
+        try {
+            html = FileUtils.readFileToString(srcFile);
+        } catch (IOException e) {
+            return HttpResponseResult.failed("读取产品协议出错");
+        } finally {
+            FileUtils.deleteQuietly(srcFile);
+        }
+        return HttpResponseResult.succeed(html);
+    }
 
-    public SysUserTsign register(Long userId, String realName, String idCardNo, String mobileNo) {
 
+    private SysUserTsign register(Long userId, String realName, String idCardNo, String mobileNo) {
         if (StringUtils.isBlank(realName) || StringUtils.isBlank(idCardNo) || StringUtils.isBlank(mobileNo)) {
             return null;
         }
@@ -223,12 +291,10 @@ public class ContractServiceImpl implements ContractService {
         return null;
     }
 
-    public void addTsign(Long userId, String organCode, String orgName) {
+    private SysUserTsign addTsign(Long userId, String organCode, String orgName) {
         Optional.ofNullable(organCode).orElseThrow(() -> new BizException("营业执照编号不能为空!"));
         Optional.ofNullable(orgName).orElseThrow(() -> new BizException("营业名称不能为空"));
 
-        SysUserTsign sysUserTsign = null;
-
         SysUserTsign orignSysUserTsign = sysUserTsignService.queryByCardNo(organCode);
 
         if (orignSysUserTsign == null) {
@@ -243,8 +309,8 @@ public class ContractServiceImpl implements ContractService {
                 throw new BizException("创建电子存证印章失败");
             }
 
-            sysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode);
-            sysUserTsignService.insert(sysUserTsign);
+            orignSysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode);
+            sysUserTsignService.insert(orignSysUserTsign);
 
         } else if (!StringUtils.equals(orignSysUserTsign.getName(), orgName)) {
             if (eSealPlugin.updateOrganAccount(orignSysUserTsign.getAccountId(), orgName, organCode)) {
@@ -252,6 +318,7 @@ public class ContractServiceImpl implements ContractService {
                 sysUserTsignService.update(orignSysUserTsign);
             }
         }
+        return orignSysUserTsign;
 
     }
 

+ 15 - 14
cooleshow-user/user-biz/src/main/resources/config/contracts/latest_contract_template.ftl

@@ -111,21 +111,22 @@
 		${contractMainContent!}
         
         <div class="signature">
-        	<#if isShowVisualSeal>
-                <div class="sign">甲方签章:${companyName}<img class="cachet" src="${companySealPicture!}" alt="" />
-                    <span>日期:${.now?string("yyyy年MM月dd日")}</span>
-                </div>
-                <div class="sign">乙方签章:${userInfo.realName!}
-                    <span>日期:${.now?string("yyyy年MM月dd日")} </span>
-                </div>
+        	    <#if isShowVisualSeal>
+                    <div class="sign">甲方签章:${companyName}
+                        <img class="cachet" src="${companySealPicture!}" alt="" />
+                        <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+                    </div>
+                    <div class="sign">乙方签章:${userInfo.realName!}
+                        <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+                    </div>
                 <#else>
-                <div class="sign">甲方签章:${companyName}
-                    <span>日期:${.now?string("yyyy年MM月dd日")}</span>
-                </div>
-                <div class="sign">乙方签章:
-                    <span>日期:${.now?string("yyyy年MM月dd日")} </span>
-                </div>
-        	</#if>
+                    <div class="sign">甲方签章:${companyName}
+                        <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+                    </div>
+                    <div class="sign">乙方签章:
+                        <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+                    </div>
+        	    </#if>
         </div>
     </div>
 </body>

+ 105 - 11
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysUserContractRecordController.java

@@ -1,16 +1,30 @@
 package com.yonge.cooleshow.student.controller;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.biz.dal.dto.search.SysUserContractRecordSearch;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.ContractTemplate;
+import com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord;
+import com.yonge.cooleshow.biz.dal.enums.DealStatusEnum;
+import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
+import com.yonge.cooleshow.biz.dal.service.ContractService;
+import com.yonge.cooleshow.biz.dal.service.ContractTemplateService;
 import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.biz.dal.vo.SysUserContractRecordVo;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.toolset.base.page.PageInfo;
-import com.yonge.toolset.mybatis.support.PageUtil;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
 import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.ContractTemplateSourceEnum;
+import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
+import com.yonge.cooleshow.common.enums.SysUserType;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 
@@ -24,11 +38,91 @@ import javax.annotation.Resource;
 @RestController
 @RequestMapping("/sysUserContractRecord")
 public class SysUserContractRecordController extends BaseController {
-    /**
-     * 服务对象
-     */
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ContractTemplateService contractTemplateService;
     @Resource
     private SysUserContractRecordService sysUserContractRecordService;
+    @Autowired
+    private ContractService contractService;
+    @Autowired
+    private WithdrawSdk withdrawSdk;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+
+    @ApiOperation("判断用户是否签署协议")
+    @GetMapping(value = "/checkContractSign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<Boolean> checkContractSign(@ApiParam(value = "业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 提现", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return HttpResponseResult.succeed(sysUserContractRecordService.checkContractSign(user.getId(), SysUserType.STUDENT, contractType));
+    }
+
+    @ApiOperation("查询最新启用的协议模板")
+    @GetMapping(value = "/queryLatestContractTemplate")
+    public HttpResponseResult<ContractTemplate> queryLatestContractTemplate(@ApiParam(value = "业务类型 REGISTER 注册 COURSES 课程购买 PRODUCT 产品 WITHDRAW 提现", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {
+        return succeed(contractTemplateService.queryLatestContractTemplate(contractType));
+    }
+
+    @ApiOperation("签署协议")
+    @GetMapping(value = "/sign", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<Boolean> sign(
+            @ApiParam(value = "协议类型", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        //是否签署标识,签署了才入库
+        boolean flag = false;
+        SysUserContractRecord contractRecord = sysUserContractRecordService.queryLatestContract(user.getId(), SysUserType.STUDENT, contractType);
+
+        //未签署协议
+        if (null == contractRecord) {
+            ContractTemplate contractTemplate = contractTemplateService.queryLatestContractTemplate(contractType);
+            if (null == contractTemplate) {
+                return failed(HttpStatus.FORBIDDEN, "未找到协议");
+            }
+            contractRecord = new SysUserContractRecord();
+            Long contractNo = idGeneratorService.generatorId("contractNo");
+            contractRecord.setContractNo(contractNo.toString());
+            contractRecord.setUserId(user.getId());
+            contractRecord.setContractId(contractTemplate.getId());
+            //注意 老师端默认用户为student
+            contractRecord.setUserType(SysUserType.STUDENT.getCode());
+
+            if (ContractTemplateSourceEnum.LINGXINPAY.getCode().equals(contractTemplate.getSource())
+                    && ContractTemplateTypeEnum.WITHDRAW.getCode().equals(contractTemplate.getType())) {
+                //签署提现协议
+                contractRecord.setStatus(DealStatusEnum.DOING.getCode());
+                flag = withdrawSdk.signContract(user.getRealName(), user.getIdCardNo(), user.getPhone(), contractNo.toString());
+            } else {
+                HttpResponseResult<String> stringHttpResponseResult = contractService.transferProduceContract(contractRecord.getUserId(), SysUserType.STUDENT, contractType);
+                if (stringHttpResponseResult.getStatus()) {
+                    contractRecord.setUrl(stringHttpResponseResult.getData());
+                    contractRecord.setStatus(DealStatusEnum.SUCCESS.getCode());
+                    flag = true;
+                }
+            }
+            if (flag) {
+                sysUserContractRecordService.save(contractRecord);
+            }
+        }
+        return HttpResponseResult.succeed(true);
+    }
+
+    @ApiOperation("查看协议")
+    @GetMapping(value = "/queryContract", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<String> queryContract(
+            @ApiParam(value = "协议类型", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return contractService.queryProductContract(user.getId(),SysUserType.STUDENT,contractType);
+    }
 
 }
 

+ 13 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysUserContractRecordController.java

@@ -96,10 +96,10 @@ public class SysUserContractRecordController extends BaseController {
                 contractRecord.setStatus(DealStatusEnum.DOING.getCode());
                 flag = withdrawSdk.signContract(user.getRealName(), user.getIdCardNo(), user.getPhone(), contractNo.toString());
             } else {
-                HttpResponseResult<String> stringHttpResponseResult = contractService.transferProduceContract(contractRecord.getUserId(), SysUserType.TEACHER, contractType, true);
+                HttpResponseResult<String> stringHttpResponseResult = contractService.transferProduceContract(contractRecord.getUserId(), SysUserType.TEACHER, contractType);
                 if (stringHttpResponseResult.getStatus()) {
                     contractRecord.setUrl(stringHttpResponseResult.getData());
-                    contractRecord.setStatus(DealStatusEnum.SCCESS.getCode());
+                    contractRecord.setStatus(DealStatusEnum.SUCCESS.getCode());
                     flag = true;
                 }
             }
@@ -110,5 +110,16 @@ public class SysUserContractRecordController extends BaseController {
         return HttpResponseResult.succeed(true);
     }
 
+    @ApiOperation("查看协议")
+    @GetMapping(value = "/queryContract", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public HttpResponseResult<String> queryContract(
+            @ApiParam(value = "协议类型", required = true) @RequestParam("contractType") ContractTemplateTypeEnum contractType) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return contractService.queryProductContract(user.getId(),SysUserType.TEACHER,contractType);
+    }
+
 }
 

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/open/UserWithdrawalClient.java

@@ -93,7 +93,7 @@ public class UserWithdrawalClient extends BaseController {
 
             if ("T".equals(return_code)) {
                 userWithdrawalService.contractCallback(
-                        DealStatusEnum.SCCESS.getCode(), content.getString("serialNo"),
+                        DealStatusEnum.SUCCESS.getCode(), content.getString("serialNo"),
                         content.getString("contractUrl"), null);
                 return "success";
             } else {