美之高 薪酬二开

This commit is contained in:
Harryxzy 2025-03-28 17:04:08 +08:00
parent 93defb41cd
commit 28b11a1bb6
11 changed files with 711 additions and 0 deletions

View File

@ -0,0 +1,28 @@
package com.engine.salary.entity.salaryacct.param;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author Harryxzy
* @ClassName MzqQueryParam
* @date 2025/03/25 15:49
* @description 美之高 查询参数
*/
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MzqQueryParam {
// 日期
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date salaryMonth ;
}

View File

@ -0,0 +1,35 @@
package com.engine.salary.entity.salaryacct.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Harryxzy
* @ClassName MzgBzBaseInfo
* @date 2025/03/26 15:24
* @description 美指高班组基础信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MzgBzBaseInfo {
/**
* 对应字段
*/
private String dyzd;
/**
* 科室名称
*/
private String ksmc;
/**
* 班组名称
*/
private String bzmc;
}

View File

@ -0,0 +1,40 @@
package com.engine.salary.entity.salaryacct.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.Map;
/**
* @author Harryxzy
* @ClassName MzgCpddData
* @date 2025/03/25 16:07
* @description 美之高 产品订单表
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MzgCpddData {
String journalid;
String bm;
String zzzb;
String scgdh;
String wlbh;
String cpxh;
String wlmc;
String tzbh;
String rksl;
String sl;
Date rq;
String jsxs;
String jsgzcl;
Map<String, String> valueMap;
}

View File

@ -231,4 +231,8 @@ public interface SalaryAcctResultService {
* @version 1.0
**/
List<SalaryAcctResultPO> listBySobSalaryMonth(Date salaryMonth, Long salarySobId, List<Long> employeeIds);
void generateMzgCpjsgzcl(MzqQueryParam param);
void generateMzgCpjsgzdj(MzqQueryParam param);
}

View File

@ -25,6 +25,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
import com.engine.salary.entity.salaryacct.param.*;
import com.engine.salary.entity.salaryacct.po.*;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.*;
import com.engine.salary.entity.salarysob.po.*;
@ -35,9 +36,12 @@ import com.engine.salary.enums.common.FilterEnum;
import com.engine.salary.enums.salaryaccounting.LockStatusEnum;
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum;
import com.engine.salary.enums.salaryformula.ReferenceTypeEnum;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.formlua.entity.parameter.DataType;
import com.engine.salary.formlua.entity.standard.ExcelResult;
import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper;
import com.engine.salary.report.service.SalaryStatisticsReportService;
import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl;
@ -66,10 +70,17 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.StopWatch;
import weaver.conn.RecordSet;
import weaver.conn.RecordSetDataSource;
import weaver.formmode.setup.ModeRightInfo;
import weaver.general.BaseBean;
import weaver.general.TimeUtil;
import weaver.hrm.User;
import weaver.wechat.util.Utils;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.CountDownLatch;
@ -200,6 +211,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
return ServiceUtil.getService(SalaryApprovalRuleServiceImpl.class, user);
}
private FormulaRunService getFormulaRunService(User user) {
return ServiceUtil.getService(FormulaRunServiceImpl.class, user);
}
private SalaryCheckResultService salaryCheckResultService;
@ -1283,4 +1297,445 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class);
return salaryAcctResultPOS;
}
@Override
public void generateMzgCpjsgzcl(MzqQueryParam param) {
if (param.getSalaryMonth() == null) {
throw new SalaryRunTimeException("参数错误");
}
// 获取美之高erp产品订单数据
Date firstDayDateOfMonth = SalaryDateUtil.getFirstDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth());
Date lastDayDateOfMonth = SalaryDateUtil.getLastDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth());
log.info("开始生成美之高产品计算工资产量,开始日期{},结束日期{}",firstDayDateOfMonth,lastDayDateOfMonth);
List<MzgCpddData> mzgCpddDataList = getERPCpddDataByDate(firstDayDateOfMonth, lastDayDateOfMonth);
log.info("产品计算工资产量erp数据数" + mzgCpddDataList.size());
// 获取部门对应系数规则数据
Map<String, ExpressFormula> bmdyxsMap = getMzgBmdyxsMap();
// 获取计算系数计算工资产量
for (MzgCpddData erpData : mzgCpddDataList) {
String bm = erpData.getBm();
ExpressFormula formula = bmdyxsMap.get(bm);
if (formula != null) {
List<FormulaVar> formulaVars = new ArrayList<>();
ExcelResult result = new ExcelResult();
try {
double sl = NumberUtils.isCreatable(erpData.getSl()) ? Math.abs(Double.valueOf(erpData.getSl())) : 0;
double rksl = NumberUtils.isCreatable(erpData.getRksl()) ? Math.abs(Double.valueOf(erpData.getRksl())) : 0;
formulaVars.add(FormulaVar.builder().fieldId("数量").content(String.valueOf(sl)).fieldType(DataType.NUMBER).build());
formulaVars.add(FormulaVar.builder().fieldId("入库数量").content(String.valueOf(rksl)).fieldType(DataType.NUMBER).build());
result = getFormulaRunService(user).run(formula, formulaVars, DataCollectionEmployee.builder().employeeId((long) user.getUID()).build());
} catch (Exception e) {
log.error("express execute fail ", e);
result.setStatus(false);
result.setErrorMsg(e.getMessage());
}
if (result.isStatus() && NumberUtils.isCreatable(Utils.null2String(result.getData()))) {
BigDecimal xsValue = new BigDecimal(result.getData().toString());
erpData.setJsxs(xsValue.toPlainString());
BigDecimal rkslValue = NumberUtils.isCreatable(erpData.getRksl()) ? new BigDecimal(erpData.getRksl()) : BigDecimal.ZERO;
erpData.setJsgzcl(rkslValue.multiply(xsValue).toPlainString());
} else {
String errorMsg = result.getErrorMsg();
log.error("计算出错 id:{}, formula:{}, formulaVars:{}, errorMsg",erpData.getJournalid(), formula, formulaVars, errorMsg);
}
}
}
// 入库权限重构
if (CollectionUtils.isNotEmpty(mzgCpddDataList)) {
log.info("产品计算工资产量开始入库");
RecordSet rs = new RecordSet();
// 入库前先删除
String deleteSql = "delete from uf_cpjsgzcl where rq >=? and rq <= ?";
rs.executeUpdate(deleteSql, new Object[]{SalaryDateUtil.getFormatLocalDate(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDate(lastDayDateOfMonth)});
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currTime = String.format("'%s'", sdf.format(new Date()));
// 获取建模模块id
BaseBean baseBean = new BaseBean();
String modeId = baseBean.getPropValue("mzgSalaryReport", "cpjsgzcl_mode_id");
// 先插入一条数据
MzgCpddData firstData = mzgCpddDataList.get(0);
StringBuilder firstSb = new StringBuilder();
firstSb.append("insert into uf_cpjsgzcl(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,bm,zzzb,scgdh,wlbh,cpxh,wlmc,tzbh,rksl,sl,rq,jsxs,jsgzcl) values (");
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(firstData.getJournalid()).append("','")
.append(firstData.getBm()).append("','")
.append(firstData.getZzzb()).append("','")
.append(firstData.getScgdh()).append("','")
.append(firstData.getWlbh()).append("','")
.append(firstData.getCpxh()).append("','")
.append(firstData.getWlmc()).append("','")
.append(firstData.getTzbh()).append("','")
.append(firstData.getRksl()).append("','")
.append(firstData.getSl()).append("','")
.append(SalaryDateUtil.getFormatLocalDate(firstData.getRq())).append("','")
.append(firstData.getJsxs()).append("','")
.append(firstData.getJsgzcl()).append("')");
rs.execute(firstSb.toString());
mzgCpddDataList.remove(0);
// 获取最大值 作为权限重构的起始id
rs.execute("select max(id) from uf_cpjsgzcl");
int minId = 0;
if (rs.next()) {
minId = rs.getInt(1);
}
int maxId = minId + mzgCpddDataList.size();
List<List<MzgCpddData>> partition = Lists.partition(mzgCpddDataList, 500);
partition.forEach(part -> {
StringBuilder sb = new StringBuilder();
sb.append("insert into uf_cpjsgzcl(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,bm,zzzb,scgdh,wlbh,cpxh,wlmc,tzbh,rksl,sl,rq,jsxs,jsgzcl) values ");
for (MzgCpddData data : part) {
sb.append("(")
.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(data.getJournalid()).append("','")
.append(data.getBm()).append("','")
.append(data.getZzzb()).append("','")
.append(data.getScgdh()).append("','")
.append(data.getWlbh()).append("','")
.append(data.getCpxh()).append("','")
.append(data.getWlmc()).append("','")
.append(data.getTzbh()).append("','")
.append(data.getRksl()).append("','")
.append(data.getSl()).append("','")
.append(SalaryDateUtil.getFormatLocalDate(data.getRq())).append("','")
.append(data.getJsxs()).append("','")
.append(data.getJsgzcl()).append("'),");
}
rs.execute(sb.substring(0,sb.length()-1).toString());
});
log.info("产品计算工资产量完成入库");
log.info("产品计算工资产量开始权限重构minid{},maxid{}",minId,maxId);
// 权限重构
if (modeId != null && NumberUtils.isCreatable(modeId)) {
Integer modeIdValue = Integer.valueOf(modeId);
for (int i = minId; i <= maxId; i++) {
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
}
}
log.info("产品计算工资产量完成权限重构minid{},maxid{}",minId,maxId);
}
}
@Override
public void generateMzgCpjsgzdj(MzqQueryParam param) {
// 查询产品计算工资产品数据
Date firstDayDateOfMonth = SalaryDateUtil.getFirstDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth());
Date lastDayDateOfMonth = SalaryDateUtil.getLastDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth());
log.info("开始生成美之高产品计算工资单价,开始日期{},结束日期{}",firstDayDateOfMonth,lastDayDateOfMonth);
List<MzgCpddData> mzgCpddDataList = getCpddDataByDate(firstDayDateOfMonth, lastDayDateOfMonth);
log.info("产品计算工资产量数据数" + mzgCpddDataList.size());
if (CollectionUtils.isNotEmpty(mzgCpddDataList)) {
// 获取所有班组基础信息
List<MzgBzBaseInfo> bzInfoList= listAllBzBaseInfoList();
log.info("获取所有班组基础信息size:" + bzInfoList.size());
Map<String, List<MzgBzBaseInfo>> ksBzMap = SalaryEntityUtil.group2Map(bzInfoList, MzgBzBaseInfo::getKsmc);
List<String> dyzdList = bzInfoList.stream().map(MzgBzBaseInfo::getDyzd).collect(Collectors.toList());
// 取出所有制造单价表数据
List<Map<String, String>> zzdjInfoList = listAllZzdjInfo(dyzdList);
log.info("取出所有制造单价表数据size:" + zzdjInfoList.size());
// 取出所有包装单价表数据
List<Map<String, String>> bzdjInfoList = listAllBzdjInfo(dyzdList);
log.info("取出所有包装单价表数据size:" + bzdjInfoList.size());
// 获取哪些部门属于包装
BaseBean baseBean = new BaseBean();
String bzKsNames = baseBean.getPropValue("mzgSalaryReport", "bz_ks_names");
List<String> bzKsList = new ArrayList<>();
try {
bzKsList.addAll(Arrays.stream(new String(bzKsNames.getBytes("ISO-8859-1"), "utf-8").split(",")).collect(Collectors.toList()));
} catch (UnsupportedEncodingException e) {
log.error("获取包装科室出错" + e);
}
String currDate = String.format("'%s'", TimeUtil.getCurrentDateString());
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String currTime = String.format("'%s'", sdf.format(new Date()));
// 获取建模模块id
String modeId = baseBean.getPropValue("mzgSalaryReport", "cpjsgzdj_mode_id");
RecordSet rs = new RecordSet();
int minId = 0;
int maxId = 0;
for (int i = 0; i < mzgCpddDataList.size(); i++ ) {
MzgCpddData cpddData = mzgCpddDataList.get(i);
String ks = cpddData.getBm();
String zzzb = cpddData.getZzzb();
// 获取该笔订单的部门获取有那些班组
List<MzgBzBaseInfo> bzList = ksBzMap.get(cpddData.getBm());
// 判断是否需要根据制作组别判断
if (StringUtils.isNotBlank(zzzb) && !(zzzb.equals(ks))) {
bzList = bzList.stream().filter(bz -> bz.getBzmc().equals(zzzb)).collect(Collectors.toList());
}
// 判断是包装还是制造
Map<String, String> djInfoMap = new HashMap<>();
if (bzKsList.contains(ks)) {
// 是包装科室从包装表根据产品型号匹配
String cpxh = cpddData.getCpxh();
List<Map<String, String>> djInfoList = bzdjInfoList.stream().filter(map ->
StringUtils.isNotBlank(map.get("cpxh")) && cpxh.equals(map.get("cpxh"))
).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(djInfoList)) {
djInfoMap = djInfoList.get(0);
}
} else {
// 是制造科室从制造表根据图纸编号匹配
String tzbh = cpddData.getTzbh();
List<Map<String, String>> djInfoList = zzdjInfoList.stream().filter(map ->
StringUtils.isNotBlank(map.get("tzbh")) && tzbh.equals(map.get("tzbh"))
).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(djInfoList)) {
djInfoMap = djInfoList.get(0);
}
}
// 获取所有班组对应的单价*计算工资产量
Double jsgzclValue = NumberUtils.isCreatable(cpddData.getJsgzcl()) ? Double.valueOf(cpddData.getJsgzcl()) : new Double(0);;
Map<String, String> gzdjValueMap = new HashMap<>();
for (MzgBzBaseInfo bz : bzList) {
Double djValue = NumberUtils.isCreatable(djInfoMap.get(bz.getDyzd())) ? Double.valueOf(djInfoMap.get(bz.getDyzd())) : new Double(0);
double value = jsgzclValue * djValue;
gzdjValueMap.put(bz.getDyzd(), String.valueOf(value));
}
cpddData.setValueMap(gzdjValueMap);
// 入库并权限重构
if (i == 0){
// 入库前先删除
String deleteSql = "delete from uf_cpjsgzdj where rq >=? and rq <= ?";
rs.executeUpdate(deleteSql, new Object[]{SalaryDateUtil.getFormatLocalDate(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDate(lastDayDateOfMonth)});
// 先插入一条数据
StringBuilder firstSb = new StringBuilder();
firstSb.append("insert into uf_cpjsgzdj(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,rq,wlbh,mc,cpxh,gg,tzbh");
for (MzgBzBaseInfo bz : bzList) {
firstSb.append(",");
firstSb.append(bz.getDyzd());
}
firstSb.append(") values (");
firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(cpddData.getJournalid()).append("','")
.append(SalaryDateUtil.getFormatLocalDate(cpddData.getRq())).append("','")
.append(Utils.null2String(cpddData.getWlbh())).append("','")
.append(Utils.null2String(djInfoMap.get("mc"))).append("','")
.append(Utils.null2String(cpddData.getCpxh())).append("','")
.append(Utils.null2String(djInfoMap.get("gg"))).append("','")
.append(Utils.null2String(cpddData.getTzbh())).append("'");
for (MzgBzBaseInfo bz : bzList) {
firstSb.append(",");
firstSb.append(gzdjValueMap.get(bz.getDyzd()) == null ? "0" : gzdjValueMap.get(bz.getDyzd()));
}
firstSb.append(")");
rs.execute(firstSb.toString());
// 获取最大值 作为权限重构的起始id
rs.execute("select max(id) from uf_cpjsgzdj");
if (rs.next()) {
minId = rs.getInt(1);
}
maxId = minId;
} else {
++maxId;
StringBuilder sb = new StringBuilder();
sb.append("insert into uf_cpjsgzdj(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,rq,wlbh,mc,cpxh,gg,tzbh");
for (MzgBzBaseInfo bz : bzList) {
sb.append(",");
sb.append(bz.getDyzd());
}
sb.append(") values (");
sb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'")
.append(cpddData.getJournalid()).append("','")
.append(SalaryDateUtil.getFormatLocalDate(cpddData.getRq())).append("','")
.append(Utils.null2String(cpddData.getWlbh())).append("','")
.append(Utils.null2String(djInfoMap.get("mc"))).append("','")
.append(Utils.null2String(cpddData.getCpxh())).append("','")
.append(Utils.null2String(djInfoMap.get("gg"))).append("','")
.append(Utils.null2String(cpddData.getTzbh())).append("'");
for (MzgBzBaseInfo bz : bzList) {
sb.append(",");
sb.append(gzdjValueMap.get(bz.getDyzd()) == null ? "0" : gzdjValueMap.get(bz.getDyzd()));
}
sb.append(")");
rs.execute(sb.toString());
}
}
// 权限重构
log.info("产品计算工资单价开始权限重构minid{},maxid{}",minId,maxId);
if (modeId != null && NumberUtils.isCreatable(modeId)) {
Integer modeIdValue = Integer.valueOf(modeId);
for (int i = minId; i <= maxId; i++) {
ModeRightInfo ModeRightInfo = new ModeRightInfo();
ModeRightInfo.setNewRight(true);
ModeRightInfo.editModeDataShare(1, modeIdValue, i);
}
}
log.info("产品计算工资单价完成权限重构minid{},maxid{}",minId,maxId);
}
}
/**
* 获取美之高erp产品订单数据
* @param firstDayDateOfMonth
* @param lastDayDateOfMonth
* @return
*/
private List<MzgCpddData> getERPCpddDataByDate(Date firstDayDateOfMonth, Date lastDayDateOfMonth) {
// 获取erp中产品订单表数据
BaseBean baseBean = new BaseBean();
String dataSource = baseBean.getPropValue("mzgSalaryReport", "erp_datasource_name");
RecordSetDataSource erpRs = new RecordSetDataSource(dataSource);
String sql = "select a.JOURNALID,d.ProdPoolId 部门,case when d.ProdPoolId ='包二课' then IWS_MakeUpTypeId else d.ProdPoolId end 制作组别,b.ProdId 生产工单号, " +
" b.IWS_ItemId 物料编号,d.IWS_Spec 产品型号,d.Name 物料名称,d.IWS_DrawingId 图纸编号, b.QtyGood 入库数量,d.QtySched 数量, b.TransDate 日期 " +
"from ProdJournalTable a,ProdJournalProd b,INVENTDIM c,prodtable d " +
"where a.JOURNALID=b.JOURNALID and a.DATAAREAID ='mg' and b.DATAAREAID ='mg' and c.DATAAREAID ='all' " +
"and a.JournalNameId in ('Finish') and c.INVENTLOCATIONID not like '%xb' " +
"and b.INVENTDIMID =c.INVENTDIMID and a.POSTED =1 and b.QtyGood<>0 " +
"and d.DATAAREAID ='mg' and d.prodid=b.prodid and d.ProdPoolId NOT in ('开发课','模具课','下料课','外协') " +
"and b.TransDate >=? and b.TransDate <= ? order by b.TransDate desc";
erpRs.executeQueryWithDatasource(sql, dataSource, new Object[]{SalaryDateUtil.getFormatLocalDateTime(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDateTime(lastDayDateOfMonth)});
List<MzgCpddData> mzgCpddDataList = new ArrayList<>();
while (erpRs.next()) {
mzgCpddDataList.add(MzgCpddData.builder()
.journalid(erpRs.getString("JOURNALID"))
.bm(erpRs.getString("部门"))
.zzzb(erpRs.getString("制作组别"))
.scgdh(erpRs.getString("生产工单号"))
.wlbh(erpRs.getString("物料编号"))
.cpxh(erpRs.getString("产品型号"))
.wlmc(erpRs.getString("物料名称"))
.tzbh(erpRs.getString("图纸编号"))
.rksl(erpRs.getString("入库数量"))
.sl(erpRs.getString("数量"))
.rq(SalaryDateUtil.stringToDate(erpRs.getString("日期")))
.build());
}
return mzgCpddDataList;
}
/**
* 获取美之高部门对应系数规则配置
* @return
*/
private Map<String, ExpressFormula> getMzgBmdyxsMap() {
RecordSet rs = new RecordSet();
String sql = "select sjbm,gs from uf_bmdyxsb" ;
rs.execute(sql);
Map<String, ExpressFormula> resultMap = new HashMap<>();
while (rs.next()) {
ExpressFormula formula = ExpressFormula.builder()
.formula("formula")
.extendParam("{\"isCustomFunction\":\"0\",\"sqlReturnKey\":\"\",\"openDecrypt\":\"0\",\"datasource\":{\"datasourceId\":\"\"}}")
.formulaRunScript(rs.getString("gs"))
.referenceType(ReferenceTypeEnum.FORMULA.getValue())
.build();
resultMap.put(rs.getString("sjbm"), formula);
}
return resultMap;
}
/**
* 获取美之高建模产品订单数据
* @param firstDayDateOfMonth
* @param lastDayDateOfMonth
* @return
*/
private List<MzgCpddData> getCpddDataByDate(Date firstDayDateOfMonth, Date lastDayDateOfMonth) {
// 获取产品订单表数据
RecordSet rs = new RecordSet();
String sql = "select journalid,bm,zzzb,scgdh,wlbh,cpxh,wlmc,tzbh,rksl,sl,rq,jsxs,jsgzcl from uf_cpjsgzcl where rq >=? and rq <= ? order by rq desc";
rs.executeQuery(sql, new Object[]{SalaryDateUtil.getFormatLocalDate(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDate(lastDayDateOfMonth)});
List<MzgCpddData> mzgCpddDataList = new ArrayList<>();
while (rs.next()) {
mzgCpddDataList.add(MzgCpddData.builder()
.journalid(rs.getString(1))
.bm(rs.getString(2))
.zzzb(rs.getString(3))
.scgdh(rs.getString(4))
.wlbh(rs.getString(5))
.cpxh(rs.getString(6))
.wlmc(rs.getString(7))
.tzbh(rs.getString(8))
.rksl(rs.getString(9))
.sl(rs.getString(10))
.rq(SalaryDateUtil.stringToDate(rs.getString(11)))
.jsxs(rs.getString(12))
.jsgzcl(rs.getString(13))
.build());
}
return mzgCpddDataList;
}
/**
* 获取美之高所有班组基础信息
* @return
*/
private List<MzgBzBaseInfo> listAllBzBaseInfoList() {
List<MzgBzBaseInfo> resultList = new ArrayList<>();
RecordSet rs = new RecordSet();
rs.execute("select dyzd,ksmc,bzmc from uf_bzjcb");
while (rs.next()) {
resultList.add(MzgBzBaseInfo.builder()
.dyzd(rs.getString("dyzd"))
.ksmc(rs.getString("ksmc"))
.bzmc(rs.getString("bzmc"))
.build());
}
return resultList;
}
/**
* 美之高 取出所有制造单价表数据
* @param dyzdList
* @return
*/
private List<Map<String, String>> listAllZzdjInfo(List<String> dyzdList) {
List<Map<String, String>> resultList = new ArrayList<>();
RecordSet rs = new RecordSet();
String fieldStr = StringUtils.join(dyzdList, ",");
String sql ="select wlbh,mc,cpxh,gg,tzbh,"+fieldStr+" from uf_zzcpdjb";
rs.execute(sql);
while (rs.next()) {
Map<String, String> singleValueMap = new HashMap<>();
singleValueMap.put("wlbh", rs.getString("wlbh"));
singleValueMap.put("mc", rs.getString("mc"));
singleValueMap.put("cpxh", rs.getString("cpxh"));
singleValueMap.put("gg", rs.getString("gg"));
singleValueMap.put("tzbh", rs.getString("tzbh"));
for (String zd : dyzdList) {
singleValueMap.put(zd, rs.getString(zd));
}
resultList.add(singleValueMap);
}
return resultList;
}
/**
* 美之高 取出所有包装单价表数据
* @param dyzdList
* @return
*/
private List<Map<String, String>> listAllBzdjInfo(List<String> dyzdList) {
List<Map<String, String>> resultList = new ArrayList<>();
RecordSet rs = new RecordSet();
String fieldStr = StringUtils.join(dyzdList, ",");
String sql ="select wlbh,mc,cpxh,gg,tzbh,"+fieldStr+" from uf_cpdjbbz";
rs.execute(sql);
while (rs.next()) {
Map<String, String> singleValueMap = new HashMap<>();
singleValueMap.put("wlbh", rs.getString("wlbh"));
singleValueMap.put("mc", rs.getString("mc"));
singleValueMap.put("cpxh", rs.getString("cpxh"));
singleValueMap.put("gg", rs.getString("gg"));
singleValueMap.put("tzbh", rs.getString("tzbh"));
for (String zd : dyzdList) {
singleValueMap.put(zd, rs.getString(zd));
}
resultList.add(singleValueMap);
}
return resultList;
}
}

View File

@ -0,0 +1,52 @@
package com.engine.salary.timer;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.salaryacct.param.MzqQueryParam;
import com.engine.salary.service.SalaryAcctResultService;
import com.engine.salary.service.impl.SalaryAcctResultServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.hrm.User;
import weaver.interfaces.schedule.BaseCronJob;
import java.time.LocalDate;
import java.util.Date;
/**
* @author Harryxzy
* @ClassName AutoSyncAttendQuoteData
* @date 2023/08/11 9:53
* @description 自动生成 美之高产品计算工资产量
*/
public class AutoSyncMzgCpjsgzcl extends BaseCronJob {
private String preMonth;
private String salaryMonth;
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
@Override
public void execute() {
User tempUser = new User();
tempUser.setUid(1);
tempUser.setLoginid("sysadmin");
LocalDate localDate = SalaryDateUtil.dateToLocalDate(new Date());
int preMonthValue = -1;
if (preMonth != null && NumberUtils.isCreatable(preMonth)) {
preMonthValue = -1 * Integer.valueOf(preMonth);
}
localDate = localDate.plusMonths(preMonthValue);
Date date = SalaryDateUtil.localDateToDate(localDate);
if (StringUtils.isNotBlank(salaryMonth) && SalaryDateUtil.checkYearMonth(salaryMonth)) {
date = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
}
MzqQueryParam param = MzqQueryParam.builder().salaryMonth(date).build();
getSalaryAcctResultService(tempUser).generateMzgCpjsgzcl(param);
}
}

View File

@ -0,0 +1,52 @@
package com.engine.salary.timer;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.salaryacct.param.MzqQueryParam;
import com.engine.salary.service.SalaryAcctResultService;
import com.engine.salary.service.impl.SalaryAcctResultServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.hrm.User;
import weaver.interfaces.schedule.BaseCronJob;
import java.time.LocalDate;
import java.util.Date;
/**
* @author Harryxzy
* @ClassName AutoSyncAttendQuoteData
* @date 2023/08/11 9:53
* @description 自动生成 美之高产品计算工资单价
*/
public class AutoSyncMzgCpjsgzdj extends BaseCronJob {
private String preMonth;
private String salaryMonth;
private SalaryAcctResultService getSalaryAcctResultService(User user) {
return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user);
}
@Override
public void execute() {
User tempUser = new User();
tempUser.setUid(1);
tempUser.setLoginid("sysadmin");
LocalDate localDate = SalaryDateUtil.dateToLocalDate(new Date());
int preMonthValue = -1;
if (preMonth != null && NumberUtils.isCreatable(preMonth)) {
preMonthValue = -1 * Integer.valueOf(preMonth);
}
localDate = localDate.plusMonths(preMonthValue);
Date date = SalaryDateUtil.localDateToDate(localDate);
if (StringUtils.isNotBlank(salaryMonth) && SalaryDateUtil.checkYearMonth(salaryMonth)) {
date = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth);
}
MzqQueryParam param = MzqQueryParam.builder().salaryMonth(date).build();
getSalaryAcctResultService(tempUser).generateMzgCpjsgzdj(param);
}
}

View File

@ -276,6 +276,18 @@ public class SalaryDateUtil {
return cal.getTime();
}
public static Date getLastDayDateOfMonthWithMinutesAndSeconds(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, last);
cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
return cal.getTime();
}
public static Date getLastDayOfMonth(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);

View File

@ -928,4 +928,26 @@ public class SalaryAcctController {
}
/**********************************线下对比 end*********************************/
// 生成美之高产品计算工资产量
@POST
@Path("/generate/mzgCpjsgzcl")
@Produces(MediaType.APPLICATION_JSON)
public String generateMzgCpjsgzcl(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody MzqQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<MzqQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::generateMzgCpjsgzcl, param);
}
// 生成美之高产品计算工资单价
@POST
@Path("/generate/mzgCpjsgzdj")
@Produces(MediaType.APPLICATION_JSON)
public String generateMzgCpjsgzdj(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody MzqQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<MzqQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::generateMzgCpjsgzdj, param);
}
}

View File

@ -279,6 +279,15 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult
getSalaryAcctResultService(user).batchUpdate(param);
}
@Override
public void generateMzgCpjsgzcl(MzqQueryParam param) {
getSalaryAcctResultService(user).generateMzgCpjsgzcl(param);
}
public void generateMzgCpjsgzdj(MzqQueryParam param) {
getSalaryAcctResultService(user).generateMzgCpjsgzdj(param);
}
/**
* 薪资核算-校验
*

View File

@ -20,4 +20,6 @@ public interface SalaryAcctResultWrapperProxy {
void calculate(SalaryAcctCalculateParam calculateParam);
void batchUpdate(SalaryAcctResultBatchUpdateParam param);
void generateMzgCpjsgzcl(MzqQueryParam param);
}