This commit is contained in:
1073413548 2024-08-16 18:09:00 +08:00
parent b55b87df8e
commit 3c10e741ae
24 changed files with 364 additions and 166 deletions

View File

@ -65,12 +65,12 @@
<#list business as item> <#list business as item>
<tr > <tr >
<td> <td>
${item.businessType} ${item.businessTypeName}
</td> </td>
<td colspan="2"> <td colspan="2">
<div style="height: 5pt;width: 1pt"></div> <div style="height: 5pt;width: 1pt"></div>
<p class="content" style="text-indent:5pt"> <p class="content" style="text-indent:5pt">
${item.businessType}-金额:${item.businessAmount}元 ${item.businessTypeName}-金额:${item.businessAmount}元
<#if item.businessDesc?? && item.businessDesc != ""> <#if item.businessDesc?? && item.businessDesc != "">
-备注:${item.businessDesc} -备注:${item.businessDesc}
</#if> </#if>
@ -114,8 +114,8 @@
<span style="">合同金额:共计¥</span> <span style="">合同金额:共计¥</span>
<span style=" text-decoration:underline"> ${contract.contractAmount}</span> <span style=" text-decoration:underline"> ${contract.contractAmount}</span>
<span style="">元(大写金额:</span> <span style="">元(大写金额:</span>
<span style=" text-decoration:underline">${contractAmount} </span> <span style=" text-decoration:underline">${contractAmount} </span>
<span style="">元整),垫付项目中涉及银行开户、刻章等,实际价格以第三方机构及政府规定为准。除此之外,甲方无需向乙方支付其他任何费用。</span></p> <span style="">,垫付项目中涉及银行开户、刻章等,实际价格以第三方机构及政府规定为准。除此之外,甲方无需向乙方支付其他任何费用。</span></p>
</td> </td>
</tr> </tr>
<tr > <tr >
@ -134,7 +134,7 @@
<td colspan="2"> <td colspan="2">
<div style="height: 5pt;width: 1pt"></div> <div style="height: 5pt;width: 1pt"></div>
<p class="content" style="text-indent:5pt"> <p class="content" style="text-indent:5pt">
<#if text2?? && text2 != ""> <#if contract.signDesc?? && contract.signDesc != "">
${contract.signDesc?if_exists} ${contract.signDesc?if_exists}
<#else> <#else>
@ -234,12 +234,12 @@
<span style=" text-decoration:underline"> </span> 月 <span style=" text-decoration:underline"> </span> 月
<span style=" text-decoration:underline"> </span> 日--> <span style=" text-decoration:underline"> </span> 日-->
</p> </p>
<#if isSign?? && isSign>
<div style="height: 500px;width: 100%;padding-top: -120px;padding-left: 120px"> <div style="height: 500px;width: 100%;padding-top: -120px;padding-left: 120px">
<img style="width:150px; height:150px; " src="${imagePath}/doc/image/allZ.png"/> <img style="width:150px; height:150px; " src="${imagePath}/doc/image/allZ.png"/>
</div> </div>
</#if>
</div> </div>
</body> </body>

View File

@ -1,13 +1,17 @@
package com.pusong.common.doc.util; package com.pusong.common.doc.util;
public class NumBerTool { public class NumBerTool {
private static final String[] NUMBERS = { "", "", "", "", "", "", "", private static final String[] NUMBERS = {"", "", "", "", "", "", "",
"", "", "" }; "", "", ""};
/** 整数部分的单位 */ /**
private static final String[] IUNIT = { "", "", "", "", "", "", "", * 整数部分的单位
"", "亿", "", "", "", "", "", "", "" }; */
/** 小数部分的单位 */ private static final String[] IUNIT = {"", "", "", "", "", "", "",
private static final String[] DUNIT = { "", ""}; "", "亿", "", "", "", "", "", "", ""};
/**
* 小数部分的单位
*/
private static final String[] DUNIT = {"", ""};
/** /**
@ -45,6 +49,7 @@ public class NumBerTool {
int[] decimals = toArray(decimalStr);// 小数部分数字 int[] decimals = toArray(decimalStr);// 小数部分数字
return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals); return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
} }
/** /**
* 整数部分和小数部分转换为数组从高位至低位 * 整数部分和小数部分转换为数组从高位至低位
*/ */
@ -55,6 +60,7 @@ public class NumBerTool {
} }
return array; return array;
} }
/** /**
* 得到中文金额的整数部分 * 得到中文金额的整数部分
*/ */
@ -66,16 +72,16 @@ public class NumBerTool {
// 特殊情况10(拾元壹拾元壹拾万元拾万元) // 特殊情况10(拾元壹拾元壹拾万元拾万元)
String key = ""; String key = "";
if (integers[i] == 0) { if (integers[i] == 0) {
if ((length-i) == 13)// (亿)(必填) if ((length - i) == 13)// (亿)(必填)
key = IUNIT[4]; key = IUNIT[4];
else if ((length-i) == 9)// 亿(必填) else if ((length - i) == 9)// 亿(必填)
key = IUNIT[8]; key = IUNIT[8];
else if ((length-i) == 5 && isMust5)// (不必填) else if ((length - i) == 5 && isMust5)// (不必填)
key = IUNIT[4]; key = IUNIT[4];
else if ((length-i) == 1)// (必填) else if ((length - i) == 1)// (必填)
key = IUNIT[0]; key = IUNIT[0];
// 0遇非0时补零不包含最后一位 // 0遇非0时补零不包含最后一位
if ((length-i) > 1 && integers[i + 1] != 0) if ((length - i) > 1 && integers[i + 1] != 0)
key += NUMBERS[0]; key += NUMBERS[0];
} }
chineseInteger.append(integers[i] == 0 ? key chineseInteger.append(integers[i] == 0 ? key
@ -83,6 +89,7 @@ public class NumBerTool {
} }
return chineseInteger.toString(); return chineseInteger.toString();
} }
/** /**
* 得到中文金额的小数部分 * 得到中文金额的小数部分
*/ */
@ -95,8 +102,12 @@ public class NumBerTool {
chineseDecimal.append(decimals[i] == 0 ? "" chineseDecimal.append(decimals[i] == 0 ? ""
: (NUMBERS[decimals[i]] + DUNIT[i])); : (NUMBERS[decimals[i]] + DUNIT[i]));
} }
if(decimals.length == 0){
chineseDecimal.append("");
}
return chineseDecimal.toString(); return chineseDecimal.toString();
} }
/** /**
* 判断第5位数字的单位""是否应加 * 判断第5位数字的单位""是否应加
*/ */
@ -106,9 +117,9 @@ public class NumBerTool {
String subInteger = ""; String subInteger = "";
if (length > 8) { if (length > 8) {
// 取得从低位数第5到第8位的字串 // 取得从低位数第5到第8位的字串
subInteger = integerStr.substring(length-8, length-4); subInteger = integerStr.substring(length - 8, length - 4);
} else { } else {
subInteger = integerStr.substring(0, length-4); subInteger = integerStr.substring(0, length - 4);
} }
return Integer.parseInt(subInteger) > 0; return Integer.parseInt(subInteger) > 0;
} else { } else {

View File

@ -44,7 +44,7 @@ public class PDFBuilder extends PdfPageEventHelper {
sb.append("\u00a0"); sb.append("\u00a0");
} }
Blank = sb.toString(); Blank = sb.toString();
fontDetail = new Font(baseFont); fontDetail = new Font(baseFont,8);
} catch (DocumentException e) { } catch (DocumentException e) {
log.error("初始化字体失败", e); log.error("初始化字体失败", e);
} catch (IOException e) { } catch (IOException e) {

View File

@ -25,6 +25,18 @@ public class PdfGenerator {
public static final String HEAD = "head"; public static final String HEAD = "head";
//是否签章 //是否签章
public static final String SIGN = "isSign"; public static final String SIGN = "isSign";
public static Configuration configuration =null;
static {
configuration = new Configuration(Configuration.VERSION_2_3_31);
// 设置模板目录
File file = new File(System.getProperty("user.dir") + "/doc");
try {
configuration.setDirectoryForTemplateLoading(file);
} catch (IOException e) {
configuration =null;
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
@ -61,10 +73,6 @@ public class PdfGenerator {
public static void makePdf(Map<String, Object> data ,String pdfpath,String templateName) throws Exception{ public static void makePdf(Map<String, Object> data ,String pdfpath,String templateName) throws Exception{
// 设置模板目录
Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
File file = new File(System.getProperty("user.dir") + "/doc");
configuration.setDirectoryForTemplateLoading(file);
// 加载模板 // 加载模板
Template template = configuration.getTemplate(templateName); Template template = configuration.getTemplate(templateName);
data.put("imagePath",System.getProperty("user.dir")); data.put("imagePath",System.getProperty("user.dir"));

View File

@ -1,5 +1,8 @@
package com.pusong.common.json.config; package com.pusong.common.json.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
@ -11,6 +14,7 @@ import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilde
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -34,7 +38,17 @@ public class JacksonConfig {
javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); // javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
//去掉最后面的0并转为字符串
javaTimeModule.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null) {
gen.writeString(value.stripTrailingZeros().toPlainString());
}
}
});
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));

View File

@ -88,7 +88,7 @@ public class PsContractInfoController extends BaseController {
/** /**
* 分页查询合同列表 * 分页查询合同列表
*/ */
@SaCheckPermission("business:contractInfo:list") @SaCheckPermission("business:contractInfo:LIST")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo<PsContractInfoVo> list(PsContractInfoQueryBo bo, PageQuery pageQuery) { public TableDataInfo<PsContractInfoVo> list(PsContractInfoQueryBo bo, PageQuery pageQuery) {
return psContractInfoService.queryPageList(bo, pageQuery); return psContractInfoService.queryPageList(bo, pageQuery);

View File

@ -19,6 +19,7 @@ import com.pusong.common.mybatis.core.page.PageQuery;
import com.pusong.business.domain.vo.PsTaskMainVo; import com.pusong.business.domain.vo.PsTaskMainVo;
import com.pusong.business.service.IPsTaskService; import com.pusong.business.service.IPsTaskService;
import com.pusong.common.mybatis.core.page.TableDataInfo; import com.pusong.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -157,6 +158,32 @@ public class PsTaskController extends BaseController {
return R.ok(); return R.ok();
} }
/**
* 上传发票
* @param id 任务id
* @param file 发票文件
* @return
*/
@Log(title = "免费工单任务作废")
@SaCheckPermission("business:task:list")
@GetMapping("/invoice")
public R<Void> taskReset(@RequestPart("file") MultipartFile file, @NotNull Long id) {
psTaskMainService.invoice(file,id);
return R.ok();
}
/**
* 任务暂停
* @param id 任务id
* @return
*/
@Log(title = "任务暂停")
@SaCheckPermission("business:task:list")
@GetMapping("/pause")
public R<Void> pause( @NotNull Long id) {
// psTaskMainService.pause(id);
return R.ok();
}
// /** // /**
// * 导出主任务列表 // * 导出主任务列表

View File

@ -34,10 +34,6 @@ public class PsApproverRecord extends TenantEntity {
* 关联业务id * 关联业务id
*/ */
private String businessId; private String businessId;
/**
* 客户来源
*/
private String customSource;
/** /**
* 合同编码 * 合同编码
*/ */

View File

@ -136,4 +136,9 @@ public class PsContractInfo extends TenantEntity {
* 服务周期结束时间 * 服务周期结束时间
*/ */
private Date endServiceDate; private Date endServiceDate;
/**
* 是否作废
*/
private String isCancel;
} }

View File

@ -70,5 +70,8 @@ public class PsTaskMain extends TenantEntity {
@TableLogic @TableLogic
private Long delFlag; private Long delFlag;
/**
* 发票
*/
private String invoice;
} }

View File

@ -41,6 +41,10 @@ public class PsContractBusinessBo {
*/ */
@NotBlank(message = "服务类型不能为空", groups = { AddGroup.class, EditGroup.class }) @NotBlank(message = "服务类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String businessType; private String businessType;
/**
* 服务类型名称生成pdf使用
*/
private String businessTypeName;
/** /**
* 服务总金额 * 服务总金额

View File

@ -24,6 +24,10 @@ import java.util.List;
@EqualsAndHashCode @EqualsAndHashCode
public class PsContractInfoQueryBo { public class PsContractInfoQueryBo {
/**
* 查询类型1合同列表 2待回款列表 3已汇款列表
*/
private Integer type;
/** /**
* 合同编码 * 合同编码
*/ */

View File

@ -190,4 +190,8 @@ public class PsContractInfoVo implements Serializable {
* 汇款记录信息信息 * 汇款记录信息信息
*/ */
private List<PsContractPayVo> contractPayVoList; private List<PsContractPayVo> contractPayVoList;
/**
* 是否作废 02审批中03是04否
*/
private String isCancel;
} }

View File

@ -103,4 +103,9 @@ public class PsTaskMainVo implements Serializable {
* 任务资料信息 * 任务资料信息
*/ */
private List<PsTaskMediaVo> taskMediaVoList; private List<PsTaskMediaVo> taskMediaVoList;
/**
* 发票
*/
private String invoice;
} }

View File

@ -16,30 +16,36 @@ public enum ContractStatusEnum {
RETURN("30","已回款(待派单处理)"), RETURN("30","已回款(待派单处理)"),
UPDATEAPPROVER("33","修改审批中"), UPDATEAPPROVER("33","修改审批中"),
EXECUTION("40","已派单(处理中)"), EXECUTION("40","已派单(处理中)"),
SUCCESS("50","已完成(任务已全部完成+回款全部完成+合同已回传)"), SUCCESS("50","已完成(任务已全部完成+回款全部完成+合同已回传)");
CANCELLATION("60","已作废"),
CANAPPROVER("61","作废审批中");
private String code; private String code;
private String text; private String text;
/**
* 返回已回款之后的状态
* @return
*/
public static List<String> getReturn(){
return List.of(RETURN.code, UPDATEAPPROVER.code,EXECUTION.code,SUCCESS.code);
}
/** /**
* 判断是否为已回款之后的合同 * 判断是否为已回款之后的合同
* @param code * @param code
* @return * @return
*/ */
public static boolean isReturn(String code){ public static boolean isReturn(String code){
List<String> list = List.of(INIT.code, CREATE.code,CANCELLATION.code,CANAPPROVER.code); List<String> list = getReturn();
if(StringUtils.isNotBlank(code) && list.contains(code)){ if(StringUtils.isNotBlank(code) && list.contains(code)){
return false;
}
return true; return true;
} }
return false;
}
/** /**
* 返回无效合同集合 * 返回无效合同集合
* @return * @return
*/ */
public static List<String> isValid(){ public static List<String> isValid(){
return List.of(INIT.code, CANAPPROVER.code); return List.of(INIT.code);
} }
} }

View File

@ -22,6 +22,15 @@ public enum TaskStatusEnum {
private String code; private String code;
private String text; private String text;
/**
* 返回已完成的任务状态
* @return
*/
public static List<String> returnFinish() {
return List.of(FINISH.code,CANCEL.code);
}
/** /**
* 判断能否派单 * 判断能否派单
*/ */
@ -36,7 +45,7 @@ public enum TaskStatusEnum {
*/ */
public static Boolean canUpload(String taskStatus){ public static Boolean canUpload(String taskStatus){
if(StringUtils.equals(taskStatus,FINISH.getCode()) if(StringUtils.equals(taskStatus,FINISH.getCode())
|| StringUtils.equals(taskStatus,OA.getCode())){ || StringUtils.equals(taskStatus,CANCEL.getCode())){
return false; return false;
} }
return true; return true;
@ -47,7 +56,7 @@ public enum TaskStatusEnum {
public static Boolean canFinish(String taskStatus){ public static Boolean canFinish(String taskStatus){
//不能点作废 完成 审批中 //不能点作废 完成 审批中
if(StringUtils.equals(taskStatus,CANCEL.getCode()) || StringUtils.equals(taskStatus,FINISH.getCode()) if(StringUtils.equals(taskStatus,CANCEL.getCode()) || StringUtils.equals(taskStatus,FINISH.getCode())
|| StringUtils.equals(taskStatus,OA.getCode())){ || StringUtils.equals(taskStatus,OA.getCode())|| StringUtils.equals(taskStatus,CANCELAPPO.getCode())){
return false; return false;
} }
return true; return true;

View File

@ -109,6 +109,12 @@ public interface IPsContractInfoService {
* @param businessProject 服务项目 * @param businessProject 服务项目
*/ */
void freeWork(String contractCode,String businessType,String businessProject); void freeWork(String contractCode,String businessType,String businessProject);
/**
* 合同完成
* @param contractCode 合同编码
*/
void finish(String contractCode);
/** /**
* 查询符合条件的合同基本信息列表 * 查询符合条件的合同基本信息列表
* *

View File

@ -9,6 +9,8 @@ import com.pusong.business.domain.vo.PsTaskAppointVo;
import com.pusong.business.domain.vo.PsTaskMainVo; import com.pusong.business.domain.vo.PsTaskMainVo;
import com.pusong.common.mybatis.core.page.TableDataInfo; import com.pusong.common.mybatis.core.page.TableDataInfo;
import com.pusong.common.mybatis.core.page.PageQuery; import com.pusong.common.mybatis.core.page.PageQuery;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.multipart.MultipartFile;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -105,7 +107,12 @@ public interface IPsTaskService {
* @param desc 作废原因 * @param desc 作废原因
*/ */
void cancel(Long id,String desc); void cancel(Long id,String desc);
/**
* 上传发票
* @param id 任务主表id
* @param file 发票文件
*/
void invoice(MultipartFile file, @NotNull Long id);
/* *//** /* *//**
* 查询主任务 * 查询主任务
* *

View File

@ -1,16 +1,25 @@
package com.pusong.business.service.approver.impl; package com.pusong.business.service.approver.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pusong.business.domain.PsApproverRecord; import com.pusong.business.domain.PsApproverRecord;
import com.pusong.business.domain.PsContractInfo; import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.PsTaskAppoint;
import com.pusong.business.domain.PsTaskMain;
import com.pusong.business.enums.ApproverTypeEnum; import com.pusong.business.enums.ApproverTypeEnum;
import com.pusong.business.enums.CommonStatusEnum; import com.pusong.business.enums.CommonStatusEnum;
import com.pusong.business.enums.ContractStatusEnum; import com.pusong.business.enums.ContractStatusEnum;
import com.pusong.business.enums.TaskStatusEnum;
import com.pusong.business.mapper.PsTaskAppointMapper;
import com.pusong.business.mapper.PsTaskMainMapper;
import com.pusong.business.service.IPsContractBusinessService; import com.pusong.business.service.IPsContractBusinessService;
import com.pusong.business.service.IPsContractInfoService; import com.pusong.business.service.IPsContractInfoService;
import com.pusong.business.service.IPsTaskService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* 合同作废审批 * 合同作废审批
*/ */
@ -23,6 +32,8 @@ public class CancellaApproverServiceImpl extends ApproverAbstractServiceImpl {
return ApproverTypeEnum.CANCELLA.getCode(); return ApproverTypeEnum.CANCELLA.getCode();
} }
private final IPsContractInfoService contractInfoService; private final IPsContractInfoService contractInfoService;
private final PsTaskMainMapper taskMainMapper;
private final PsTaskAppointMapper taskAppointMapper;
/** /**
* 1 审批成功 合同作废成功合同状态显示为已作废 * 1 审批成功 合同作废成功合同状态显示为已作废
@ -32,8 +43,17 @@ public class CancellaApproverServiceImpl extends ApproverAbstractServiceImpl {
public void success(PsApproverRecord psApproverRecord) { public void success(PsApproverRecord psApproverRecord) {
PsContractInfo psContractInfo = new PsContractInfo(); PsContractInfo psContractInfo = new PsContractInfo();
psContractInfo.setContractCode(psApproverRecord.getContractCode()); psContractInfo.setContractCode(psApproverRecord.getContractCode());
psContractInfo.setContractStatus(ContractStatusEnum.CANCELLATION.getCode()); psContractInfo.setIsCancel(CommonStatusEnum.SUCCESS.getCode());
contractInfoService.updateByCode(psContractInfo); contractInfoService.updateByCode(psContractInfo);
//主任务作废
taskMainMapper.update(Wrappers.<PsTaskMain>lambdaUpdate()
.set(PsTaskMain::getTaskStatus,TaskStatusEnum.CANCEL)
.eq(PsTaskMain::getContractCode, psApproverRecord.getContractCode())
.ne(PsTaskMain::getTaskStatus,TaskStatusEnum.CANCEL));
//子任务作废
taskAppointMapper.update(Wrappers.<PsTaskAppoint>lambdaUpdate()
.set(PsTaskAppoint::getAppointStatus, TaskStatusEnum.AppointStatusEnum.CANCEL.getCode())
.eq(PsTaskAppoint::getContractCode, psApproverRecord.getContractCode()));
} }
/** /**
@ -44,7 +64,7 @@ public class CancellaApproverServiceImpl extends ApproverAbstractServiceImpl {
public void fail(PsApproverRecord psApproverRecord) { public void fail(PsApproverRecord psApproverRecord) {
PsContractInfo info = new PsContractInfo(); PsContractInfo info = new PsContractInfo();
info.setContractCode(psApproverRecord.getContractCode()); info.setContractCode(psApproverRecord.getContractCode());
info.setContractStatus(psApproverRecord.getUpdateData()); info.setIsCancel(CommonStatusEnum.FAIL.getCode());
contractInfoService.updateByCode(info); contractInfoService.updateByCode(info);
} }
} }

View File

@ -73,6 +73,7 @@ public class PayContractApproverServiceImpl extends ApproverAbstractServiceImpl
updateInfo.setContractStatus(ContractStatusEnum.RETURN.getCode()); updateInfo.setContractStatus(ContractStatusEnum.RETURN.getCode());
psContractInfoService.updateByCode(updateInfo); psContractInfoService.updateByCode(updateInfo);
} }
psContractInfoService.finish(psApproverRecord.getContractCode());
} }
@Override @Override

View File

@ -45,6 +45,7 @@ public class RolbackApproverServiceImpl extends ApproverAbstractServiceImpl {
psContractInfo.setRollBackStatus(CommonStatusEnum.SUCCESS.getCode()); psContractInfo.setRollBackStatus(CommonStatusEnum.SUCCESS.getCode());
psContractInfo.setRollBackPdf(Long.valueOf(psApproverRecord.getUpdateData())); psContractInfo.setRollBackPdf(Long.valueOf(psApproverRecord.getUpdateData()));
contractInfoService.updateByCode(psContractInfo); contractInfoService.updateByCode(psContractInfo);
contractInfoService.finish(psContractInfo.getContractCode());
} }
@Override @Override

View File

@ -8,6 +8,7 @@ import com.pusong.business.enums.ContractStatusEnum;
import com.pusong.business.enums.TaskStatusEnum; import com.pusong.business.enums.TaskStatusEnum;
import com.pusong.business.mapper.PsTaskMainMapper; import com.pusong.business.mapper.PsTaskMainMapper;
import com.pusong.business.service.IPsContractInfoService; import com.pusong.business.service.IPsContractInfoService;
import com.pusong.business.service.impl.PsContractInfoServiceImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -24,6 +25,7 @@ public class TaskFinishApproverServiceImpl extends ApproverAbstractServiceImpl {
return ApproverTypeEnum.TASKFINISH.getCode(); return ApproverTypeEnum.TASKFINISH.getCode();
} }
private final PsTaskMainMapper taskMainMapper; private final PsTaskMainMapper taskMainMapper;
private final IPsContractInfoService contractInfoService;
/** /**
* 1 审批成功 任务的状态变为成功 * 1 审批成功 任务的状态变为成功
@ -34,7 +36,7 @@ public class TaskFinishApproverServiceImpl extends ApproverAbstractServiceImpl {
PsTaskMain info = taskMainMapper.selectById(psApproverRecord.getBusinessId()); PsTaskMain info = taskMainMapper.selectById(psApproverRecord.getBusinessId());
info.setTaskStatus(TaskStatusEnum.FINISH.getCode()); info.setTaskStatus(TaskStatusEnum.FINISH.getCode());
taskMainMapper.updateById(info); taskMainMapper.updateById(info);
contractInfoService.finish(info.getContractCode());
} }
/** /**

View File

@ -8,6 +8,7 @@ import com.pusong.business.domain.bo.*;
import com.pusong.business.domain.vo.*; import com.pusong.business.domain.vo.*;
import com.pusong.business.enums.*; import com.pusong.business.enums.*;
import com.pusong.business.mapper.PsContractBusinessMapper; import com.pusong.business.mapper.PsContractBusinessMapper;
import com.pusong.business.mapper.PsTaskMainMapper;
import com.pusong.business.service.*; import com.pusong.business.service.*;
import com.pusong.business.service.approver.ApproverContainer; import com.pusong.business.service.approver.ApproverContainer;
import com.pusong.business.service.approver.ApproverService; import com.pusong.business.service.approver.ApproverService;
@ -71,6 +72,7 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
private final ApproverContainer container; private final ApproverContainer container;
private final IPsTaskService taskMainService; private final IPsTaskService taskMainService;
private final PsTaskMainMapper taskMainMapper;
private final ISysDictDataService dictDataService; private final ISysDictDataService dictDataService;
public static String getContractCode(){ public static String getContractCode(){
@ -118,6 +120,7 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
BigDecimal sum = bo.getBusinessList().stream().map(PsContractBusinessBo::getBusinessAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal sum = bo.getBusinessList().stream().map(PsContractBusinessBo::getBusinessAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
add.setContractAmount(sum);//合同总金额 add.setContractAmount(sum);//合同总金额
add.setContractStatus(type == 1?ContractStatusEnum.INIT.getCode():ContractStatusEnum.CREATE.getCode());//合同状态 add.setContractStatus(type == 1?ContractStatusEnum.INIT.getCode():ContractStatusEnum.CREATE.getCode());//合同状态
add.setIsCancel(CommonStatusEnum.INIT.getCode());
baseMapper.insertOrUpdate(add); baseMapper.insertOrUpdate(add);
//4.删除所有服务类型和服务项目,.插入服务类型 //4.删除所有服务类型和服务项目,.插入服务类型
businessService.saveList(bo.getBusinessList(),add.getContractCode()); businessService.saveList(bo.getBusinessList(),add.getContractCode());
@ -205,6 +208,14 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
*/ */
@Override @Override
public TableDataInfo<PsContractInfoVo> queryPageList(PsContractInfoQueryBo bo, PageQuery pageQuery) { public TableDataInfo<PsContractInfoVo> queryPageList(PsContractInfoQueryBo bo, PageQuery pageQuery) {
if(bo.getType() == null || bo.getType() == 1){//合同列表要作废数据
}else if(bo.getType() == 2){//待回款不要作废数据
bo.setInContractStatus(List.of(ContractStatusEnum.CREATE.getCode()));
}else if (bo.getType() == 3){//已回款(要特定的作废数据)
bo.setInContractStatus(ContractStatusEnum.getReturn());
}else if (bo.getType() == 4){//托管续费合同
}
QueryWrapper<PsContractInfo> lqw = buildQueryWrapper(bo); QueryWrapper<PsContractInfo> lqw = buildQueryWrapper(bo);
Page<PsContractInfoVo> result = baseMapper.selectPageContractList(pageQuery.build(), lqw); Page<PsContractInfoVo> result = baseMapper.selectPageContractList(pageQuery.build(), lqw);
if(CollectionUtils.isEmpty(result.getRecords())){ if(CollectionUtils.isEmpty(result.getRecords())){
@ -248,6 +259,16 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
//3.插入公司信息 //3.插入公司信息
companyInfoService.saveBo(bo.getCompanyInfoBo()); companyInfoService.saveBo(bo.getCompanyInfoBo());
//4.装填合同信息 //4.装填合同信息
bo.getBusinessList().forEach(item->{
BigDecimal mony = BigDecimal.ZERO;
if(CollectionUtils.isNotEmpty(item.getDetailBos())){
mony = item.getDetailBos().stream().map(PsContractBusinessDetailBo::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
}
//服务类别填了才会修改服务项目的金额
if(mony.compareTo(BigDecimal.ZERO) > 0){
item.setBusinessAmount(mony);
}
});
BigDecimal sum = bo.getBusinessList().stream().map(PsContractBusinessBo::getBusinessAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal sum = bo.getBusinessList().stream().map(PsContractBusinessBo::getBusinessAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
bo.setContractAmount(sum);//合同总金额 bo.setContractAmount(sum);//合同总金额
@ -266,18 +287,6 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
PsContractInfo add = new PsContractInfo(); PsContractInfo add = new PsContractInfo();
MapstructUtils.convert(bo,add); MapstructUtils.convert(bo,add);
add.setCompanyId(bo.getCompanyInfoBo().getId());//公司id add.setCompanyId(bo.getCompanyInfoBo().getId());//公司id
bo.getBusinessList().forEach(item->{
BigDecimal mony = BigDecimal.ZERO;
if(CollectionUtils.isNotEmpty(item.getDetailBos())){
mony = item.getDetailBos().stream().map(PsContractBusinessDetailBo::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
}
//服务类别填了才会修改服务项目的金额
if(mony.compareTo(BigDecimal.ZERO) > 0){
item.setBusinessAmount(mony);
}
});
add.setContractAmount(sum);//合同总金额
this.updateByCode(add); this.updateByCode(add);
//4.删除所有服务类型和服务项目,.插入服务类型 //4.删除所有服务类型和服务项目,.插入服务类型
businessService.saveList(bo.getBusinessList(),add.getContractCode()); businessService.saveList(bo.getBusinessList(),add.getContractCode());
@ -299,16 +308,14 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
PsContractInfoVo infoVo = this.queryContractByCode(contractCode); PsContractInfoVo infoVo = this.queryContractByCode(contractCode);
//没有任何一笔收款点击作废直接作废合同 //没有任何一笔收款点击作废直接作废合同
if(CollectionUtils.isEmpty(infoVo.getContractPayVoList())){ if(CollectionUtils.isEmpty(infoVo.getContractPayVoList())){
info.setContractStatus(ContractStatusEnum.CANCELLATION.getCode()); info.setIsCancel(CommonStatusEnum.SUCCESS.getCode());
//todo 1已派单撤回任务派单不在任务列表展示
// 2未派单更新任务列表不在任务列表展示
}else{ }else{
if(StringUtils.isBlank(desc)){throw new ServiceException("请填写作废原因");} if(StringUtils.isBlank(desc)){throw new ServiceException("请填写作废原因");}
//有收款点击作废填写作废原因后发起作废审批 //有收款点击作废填写作废原因后发起作废审批
ApproverService service = container.getService(ApproverTypeEnum.CANCELLA.getCode()); ApproverService service = container.getService(ApproverTypeEnum.CANCELLA.getCode());
service.apply(contractCode,contractCode,desc, infoVo.getContractStatus()); service.apply(contractCode,contractCode,desc, null);
info.setContractStatus(ContractStatusEnum.CANAPPROVER.getCode()); info.setIsCancel(CommonStatusEnum.ING.getCode());
} }
updateByCode(info); updateByCode(info);
@ -335,6 +342,7 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
//没有任何退款处理合同列表状态更新为待回款并显示在待回款列表 //没有任何退款处理合同列表状态更新为待回款并显示在待回款列表
info.setContractStatus(ContractStatusEnum.CREATE.getCode()); info.setContractStatus(ContractStatusEnum.CREATE.getCode());
} }
info.setIsCancel(CommonStatusEnum.INIT.getCode());
updateByCode(info); updateByCode(info);
return true; return true;
} }
@ -356,6 +364,9 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
public Long makePdf(PsContractInfo add ,PsContractInfoBo bo){ public Long makePdf(PsContractInfo add ,PsContractInfoBo bo){
Long ossId = null; Long ossId = null;
SysDictData main = dictDataService.selectDict("contract_main", add.getContractMain()); SysDictData main = dictDataService.selectDict("contract_main", add.getContractMain());
bo.getBusinessList().forEach(item->{
item.setBusinessTypeName(dictDataService.selectDictLabel("contract_type",item.getBusinessType()));
});
try{ try{
//生成合同pdf //生成合同pdf
PsCustomInfo customer = customInfoService.listById(add.getCustomId()); PsCustomInfo customer = customInfoService.listById(add.getCustomId());
@ -374,7 +385,8 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
map.put(PdfGenerator.HEAD,head); map.put(PdfGenerator.HEAD,head);
//是否签章 //是否签章
map.put(PdfGenerator.SIGN,StringUtils.equals(CommonStatusEnum.SUCCESS.getCode(),add.getSignStatus())); map.put(PdfGenerator.SIGN,StringUtils.equals(CommonStatusEnum.SUCCESS.getCode(),add.getSignStatus()));
String path = System.getProperty("user.dir")+"test.pdf";
String path = System.getProperty("user.dir")+"/"+bo.getCompanyInfoBo().getCompanyName()+"-"+add.getContractCode()+".pdf";
log.info(JSON.toJSONString(map)); log.info(JSON.toJSONString(map));
// path = "D:/王立帅/临时/output.pdf"; // path = "D:/王立帅/临时/output.pdf";
PdfGenerator.makePdf(map, path,TenplateEnum.CONTRACT.getName()); PdfGenerator.makePdf(map, path,TenplateEnum.CONTRACT.getName());
@ -426,6 +438,28 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
service.apply(info.getContractCode(),info.getContractCode(),null, businessType+"@@"+businessProject); service.apply(info.getContractCode(),info.getContractCode(),null, businessType+"@@"+businessProject);
} }
/**
* 合同完成
* @param contractCode 合同编码
*/
public void finish(String contractCode){
Long num = taskMainMapper.selectCount(Wrappers.<PsTaskMain>lambdaQuery()
.eq(PsTaskMain::getContractCode, contractCode)
.ne(PsTaskMain::getTaskType, TaskTypeEnum.INVOICE.getCode())
.notIn(PsTaskMain::getTaskStatus, TaskStatusEnum.returnFinish()));
PsContractInfoVo info = this.queryContractByCode(contractCode);
//任务已完成 合同已回传 回款已结束
if(info.getRollBackStatus().equals(CommonStatusEnum.SUCCESS.getCode())
&& num<=0 && info.getResidualMoney().compareTo(BigDecimal.ZERO)<=0){
PsContractInfo psContractInfo = new PsContractInfo();
psContractInfo.setContractCode(contractCode);
info.setContractStatus(ContractStatusEnum.SUCCESS.getCode());
this.updateByCode(psContractInfo);
}
}
private QueryWrapper<PsContractInfo> buildQueryWrapper(PsContractInfoQueryBo bo) { private QueryWrapper<PsContractInfo> buildQueryWrapper(PsContractInfoQueryBo bo) {
QueryWrapper<PsContractInfo> qw = Wrappers.query(); QueryWrapper<PsContractInfo> qw = Wrappers.query();
//删除标志 //删除标志
@ -443,7 +477,19 @@ public class PsContractInfoServiceImpl implements IPsContractInfoService {
qw.like( StringUtils.isNotBlank(bo.getCompanyName()),"com.company_name", bo.getCompanyName()); qw.like( StringUtils.isNotBlank(bo.getCompanyName()),"com.company_name", bo.getCompanyName());
//用户表条件 //用户表条件
qw.like( StringUtils.isNotBlank(bo.getCustomManagerName()),"us.nick_name", bo.getCustomManagerName()); qw.like( StringUtils.isNotBlank(bo.getCustomManagerName()),"us.nick_name", bo.getCustomManagerName());
//待回款不要作废数据 已回款需要展示退款中的作废数据
qw.ne(bo.getType() != null && (bo.getType() == 2 || (bo.getType() == 3)),"info.is_cancel",CommonStatusEnum.SUCCESS.getCode());
qw.or().gt(bo.getType() != null && bo.getType() == 2,"((select IFNULL(sum(pa.money),0) from ps_contract_pay pa where pa.pay_status = 1 and pa.business_type = 1 and pa.contract_code = info.contract_code\n" +
")-(select IFNULL(sum(pay.money),0) from ps_contract_pay pay where pay.pay_status = 1 and pay.business_type = 2 and pay.contract_code = info.contract_code))",0);
//托管续费合同
qw.exists(bo.getType() != null && bo.getType() == 4
,"select 1 from ps_contract_business bus where info.contract_code = bus.contract_code and bus.business_type = 4");
qw.orderByDesc("info.create_time"); qw.orderByDesc("info.create_time");
return qw; return qw;
} }
private PsContractInfoVo fillContractInfo(PsContractInfoVo vo){ private PsContractInfoVo fillContractInfo(PsContractInfoVo vo){

View File

@ -31,9 +31,11 @@ import com.pusong.common.core.utils.MapstructUtils;
import com.pusong.common.core.utils.StringUtils; import com.pusong.common.core.utils.StringUtils;
import com.pusong.common.mybatis.core.page.PageQuery; import com.pusong.common.mybatis.core.page.PageQuery;
import com.pusong.common.mybatis.core.page.TableDataInfo; import com.pusong.common.mybatis.core.page.TableDataInfo;
import com.pusong.system.domain.vo.SysOssVo;
import com.pusong.system.service.ISysOssService; import com.pusong.system.service.ISysOssService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -43,6 +45,7 @@ import com.pusong.business.domain.PsTaskMain;
import com.pusong.business.mapper.PsTaskMainMapper; import com.pusong.business.mapper.PsTaskMainMapper;
import com.pusong.business.service.IPsTaskService; import com.pusong.business.service.IPsTaskService;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
@ -208,6 +211,10 @@ public class PsTaskServiceImpl implements IPsTaskService {
if(!TaskStatusEnum.canAppoint(mainTask.getTaskStatus())){ if(!TaskStatusEnum.canAppoint(mainTask.getTaskStatus())){
throw new ServiceException("任务已完成,无法继续派单"); throw new ServiceException("任务已完成,无法继续派单");
} }
if(StringUtils.equals(TaskTypeEnum.INVOICE.getCode(),mainTask.getTaskType())){
throw new ServiceException("发票任务无需派单");
}
List<PsTaskAppoint> list = appointMapper.selectList(Wrappers.<PsTaskAppoint>lambdaQuery() List<PsTaskAppoint> list = appointMapper.selectList(Wrappers.<PsTaskAppoint>lambdaQuery()
.eq(PsTaskAppoint::getDelFlag,"0").eq(PsTaskAppoint::getTaskId, bo.getId()) .eq(PsTaskAppoint::getDelFlag,"0").eq(PsTaskAppoint::getTaskId, bo.getId())
.eq(PsTaskAppoint::getAppointType, bo.getAppointType()) .eq(PsTaskAppoint::getAppointType, bo.getAppointType())
@ -341,7 +348,19 @@ public class PsTaskServiceImpl implements IPsTaskService {
return lqw; return lqw;
} }
/**
* 上传发票
* @param id 任务主表id
* @param file 发票文件
*/
public void invoice(MultipartFile file, Long id){
PsTaskMain info = baseMapper.selectById(id);
if(!StringUtils.equals(TaskTypeEnum.INVOICE.getCode(),info.getTaskType())){
throw new ServiceException("发票任务才可以上传发票");
}
SysOssVo vo = ossService.upload(file);
info.setInvoice(vo.getOssId()+"");
}
// /** // /**