Browse Source

feat: 财务复核功能-财务复核/批量财务复核接口

lixuesong 1 year ago
parent
commit
d7e726f216

+ 76 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java

@@ -331,7 +331,7 @@ public class WmPayOffController {
 	/**
 	 * 查询财务结算复核汇总数据
 	 *
-	 * @param realName 姓名
+	 * @param realname 姓名
 	 * @param subjectLocation 结算渠道
 	 * @return {@link R}<{@link ?}> 结果
 	 */
@@ -774,6 +774,81 @@ public class WmPayOffController {
 		return R.ok(msgList);
 	}
 
+	/**
+	 * 财务复核(通过则直接发起结算)
+	 *
+	 * @param input 参数
+	 * @return {@link R}<{@link ?}> 结果
+	 */
+	@SysLog("财务复核")
+	@PostMapping("/financial-review")
+	public R<?> financialReview(@RequestBody WmScorePackageSettleInput input) {
+
+		if (StrUtil.isBlank(input.getId()) || input.getReviewStatus() == null) {
+			return R.failed("id或财务复核状态必填");
+		}
+
+		return wmPayOffService.financialReview(input);
+	}
+
+	/**
+	 * 批量财务复核(通过则直接发起结算)
+	 *
+	 * @param inputList 参数
+	 * @return {@link R}<{@link ?}> 结果
+	 */
+	@SysLog("批量财务复核")
+	@PostMapping("/batch-financial-review")
+	public R<?> batchFinancialReview(@RequestBody List<WmScorePackageSettleInput> inputList) {
+
+		if (CollectionUtil.isEmpty(inputList)) {
+			return R.failed("参数为空");
+		}
+
+		List<Map<String, String>> msgList = new ArrayList<>();
+
+		for (WmScorePackageSettleInput input : inputList) {
+			if (StrUtil.isBlank(input.getId()) || input.getReviewStatus() == null) {
+				return R.failed("id或财务复核状态必填");
+			}
+
+			// 查询结算详情(用于拼接notes数据)
+			R<?> queryR = wmPayOffService.settleById(input.getId());
+
+			if (queryR.getCode() == 0) {
+				Map<String, Object> queryData = (Map<String, Object>) queryR.getData();
+				List<WmScorePackageSettleNote> notes = (List<WmScorePackageSettleNote>) queryData.get("notes");
+
+				input.setNotes(notes);
+				// 调用单个结算
+				R<?> settleR = wmPayOffService.settleIssueBySubType(input);
+				boolean failFlag;
+				if (settleR.getCode() == 0) {
+					// 结算成功,不进行页面提示
+					Optional<WmScorePackageSettleNote> any = notes.stream().filter(note -> !DingEnum.NOTE_STATUS_SUBMIT.getType().equals(note.getSettleNoteStatus())).findAny();
+					failFlag = any.isPresent();
+				} else {
+					failFlag = true;
+				}
+
+				if (failFlag) {
+					Map<String, String> msgMap = new HashMap<>(2);
+					msgMap.put("packageName", input.getScorePackageName());
+					msgMap.put("reason", settleR.getMsg());
+					msgList.add(msgMap);
+				}
+
+			} else {
+				Map<String, String> msgMap = new HashMap<>(2);
+				msgMap.put("packageName", input.getScorePackageName());
+				msgMap.put("reason", queryR.getMsg());
+				msgList.add(msgMap);
+			}
+		}
+
+		return R.ok(msgList);
+	}
+
 	/**
 	 * 手动回调
 	 *

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageSettleInput.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.entity.input;
 
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
@@ -118,4 +119,9 @@ public class WmScorePackageSettleInput implements Serializable {
 	 */
 	private String invoiceNumber;
 
+	/**
+	 * 财务复核状态
+	 */
+	private UpmsState.SettleFinancialReviewStatus reviewStatus;
+
 }

+ 8 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPayOffService.java

@@ -94,4 +94,12 @@ public interface WmPayOffService extends IService<WmPayOff> {
 	 * @return 提交结果
 	 */
 	R<?> settleReIssueBySubType(WmScorePackageSettleInput input);
+
+	/**
+	 * 财务复核(通过则直接发起结算)
+	 *
+	 * @param input 参数
+	 * @return {@link R}<{@link ?}>
+	 */
+	R<?> financialReview(WmScorePackageSettleInput input);
 }

+ 77 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
@@ -28,6 +29,7 @@ import com.qunzhixinxi.hnqz.admin.mapper.SysUserSubMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmPayOffMapper;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.ding.config.DingConfig;
 import com.qunzhixinxi.hnqz.common.ding.entity.*;
@@ -64,6 +66,7 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 结算表
@@ -754,6 +757,9 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 			note.setSettleDeptSubId(sysDeptSub.getSubId());
 		});
 
+		// 校验是否财务复核并更新
+		this.checkAndUpdateFinancialReviewForSettle(input, operator, sysDept);
+
 		// 人力家
 		if (SubjectTypeEnum.TYPE_RENLIJIA.getCode().equals(subType)) {
 			return settleByRenLiJia(input, sysDeptSub, operator);
@@ -802,6 +808,77 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 
 	}
 
+	/**
+	 * 财务复核(通过则直接发起结算)
+	 *
+	 * @param input 参数
+	 * @return {@link R}<{@link ?}>
+	 */
+	@Override
+	public R<?> financialReview(WmScorePackageSettleInput input) {
+		HnqzUser operator = SecurityUtils.getUser();
+		this.checkAndUpdateFinancialReviewForReview(input, operator);
+
+		return this.settleIssueBySubType(input);
+	}
+
+	/**
+	 * 校验是否财务复核并更新
+	 *
+	 * @param input 结算入参
+	 * @param operator 操作人
+	 */
+	private void checkAndUpdateFinancialReviewForReview(WmScorePackageSettleInput input, HnqzUser operator) {
+		// 1.财务复核员操作通过,则直接发起结算
+		// 2.财务复核员操作不通过则改为复核不通过状态,结算状态也改为复核不通过
+		LocalDateTime now = LocalDateTime.now();
+		Set<Integer> noteIds = input.getNotes().stream().map(WmScorePackageSettleNote::getId).collect(Collectors.toSet());
+		List<WmScorePackageSettleNote> settleNotes = noteService.listByIds(noteIds);
+		Set<WmScorePackageSettleNote> updateNotes = settleNotes.stream().map(note -> {
+			WmScorePackageSettleNote updateNote = new WmScorePackageSettleNote();
+			updateNote.setId(note.getId());
+			updateNote.setReviewStatus(input.getReviewStatus());
+			updateNote.setReviewUser(operator.getId());
+			updateNote.setReviewTime(now);
+			return updateNote;
+		}).collect(Collectors.toSet());
+		noteService.updateBatchById(updateNotes);
+	}
+
+	/**
+	 * 校验是否财务复核并更新
+	 *
+	 * @param input 结算入参
+	 * @param operator 操作人
+	 * @param sysDept 企业信息
+	 */
+	private void checkAndUpdateFinancialReviewForSettle(WmScorePackageSettleInput input, HnqzUser operator, SysDept sysDept) {
+		// 校验企业是否配置了财务复核, 有则到财务复核
+		if (UpmsType.FinancialReviewType.AUTO.equals(sysDept.getFinancialReviewType())) {
+			// 企业配置为自动的,则跳过复核,直接发起结算
+			LocalDateTime now = LocalDateTime.now();
+			Set<WmScorePackageSettleNote> updateNotes = input.getNotes().stream().map(note -> {
+				WmScorePackageSettleNote updateNote = new WmScorePackageSettleNote();
+				updateNote.setId(note.getId());
+				updateNote.setReviewStatus(UpmsState.SettleFinancialReviewStatus.AUTO);
+				updateNote.setReviewUser(operator.getId());
+				updateNote.setReviewTime(now);
+				return updateNote;
+			}).collect(Collectors.toSet());
+			noteService.updateBatchById(updateNotes);
+		} else {
+			// 企业配置为手动的,则判断是否复核通过,
+			// 判断如果当前是复核通过,则直接发起结算,如果是不通过则不能发起
+			Set<Integer> noteIds = input.getNotes().stream().map(WmScorePackageSettleNote::getId).collect(Collectors.toSet());
+			List<WmScorePackageSettleNote> settleNotes = noteService.listByIds(noteIds);
+			boolean allMatch = settleNotes.stream()
+					.allMatch(note -> UpmsState.SettleFinancialReviewStatus.PASSED.equals(note.getReviewStatus()));
+			if (!allMatch) {
+				throw new BizException("未复核或复核不通过,不能发起结算");
+			}
+		}
+	}
+
 	/**
 	 * 福建企赋结算操作
 	 *