package com.malk.service.workhours;
import com.alibaba.fastjson.JSON;
import com.malk.server.aliwork.YDConf;
import com.malk.server.aliwork.YDParam;
import com.malk.server.common.McException;
import com.malk.server.dingtalk.DDR_New;
import com.malk.server.workhours.MonthClosingCheckRequest;
import com.malk.server.workhours.MonthClosingConf;
import com.malk.server.workhours.MonthClosingStatusResult;
import com.malk.server.workhours.MonthClosingValidationResult;
import com.malk.server.workhours.WHConf;
import com.malk.service.aliwork.YDClient;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.YearMonth;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* 月度封账统一校验服务。
*
*
TimeCard 与封账流程提交前均调用本服务,避免页面各自维护不同口径。
*/
@Service
public class MonthClosingService {
private static final int PAGE_SIZE = 100;
private static final int MAX_PAGES = 1000;
private static final String APPROVAL_MONTH_FIELD = "textField_mmd2lv0y";
private static final String SUMMARY_MONTH_FIELD = "textField_mmbffvda";
private static final String SUMMARY_STATUS_IN_APPROVAL = "审批中";
private static final String WRITE_BACK_SUCCESS = "全部成功";
private static final String STATUS_CLOSED = "封账";
private static final String STATUS_REOPENED = "启封";
private static final ZoneId BUSINESS_ZONE = ZoneId.of("Asia/Shanghai");
private static final DateTimeFormatter MONTH_FORMATTER =
DateTimeFormatter.ofPattern("uuuuMM").withResolverStyle(ResolverStyle.STRICT);
@Autowired
private YDClient ydClient;
@Autowired
private WHConf whConf;
@Autowired
private MonthClosingConf closingConf;
/**
* 查询目标月份是否已封账。
*
* @param request 月份请求
* @return 已审批封账与进行中封账数量
*/
public MonthClosingStatusResult status(MonthClosingCheckRequest request) {
String monthText = validateRequest(request);
return queryClosingStatus(monthText);
}
/**
* 校验目标月份是否允许发起封账。
*
* @param request 月份请求
* @return 封账许可、阻塞数量及提示
*/
public MonthClosingValidationResult validate(MonthClosingCheckRequest request) {
String monthText = validateRequest(request);
String requestedStatus = validateClosingStatus(request.getClosingStatus());
MonthClosingStatusResult closingStatus = queryClosingStatus(monthText);
if (STATUS_REOPENED.equals(requestedStatus)) {
return validateReopening(monthText, closingStatus);
}
return validateClosing(monthText, closingStatus);
}
private MonthClosingValidationResult validateClosing(
String monthText,
MonthClosingStatusResult closingStatus) {
if (closingStatus.isClosed() || closingStatus.getRunningClosingCount() > 0) {
return buildValidationResult(monthText, STATUS_CLOSED, closingStatus, 0, 0, 0, 0);
}
List