|
|
@@ -0,0 +1,299 @@
|
|
|
+package com.kingdee.eas.custom.ssPDF.handler;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.kingdee.bos.Context;
|
|
|
+import com.kingdee.eas.util.app.DbUtil;
|
|
|
+import com.kingdee.jdbc.rowset.IRowSet;
|
|
|
+import com.kingdee.shr.base.syssetting.context.SHRContext;
|
|
|
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
|
|
|
+import com.kingdee.shr.base.syssetting.web.dynamic.util.DynamicUtil;
|
|
|
+import com.kingdee.shr.base.syssetting.web.dynamic.util.MD5;
|
|
|
+import com.kingdee.shr.base.syssetting.web.util.UserUtil;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.ui.ModelMap;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import javax.servlet.http.HttpSession;
|
|
|
+import java.io.BufferedWriter;
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileWriter;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.sql.Date;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author 青梧
|
|
|
+ * @version 1.0
|
|
|
+ * @description: 员工信息查询 txt文件下载
|
|
|
+ * @date 2025/11/14 10:53
|
|
|
+ */
|
|
|
+public class CmpReportDynamicListHandlerTowEx extends CmpReportDynamicListHandlerEx {
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(CmpReportDynamicListHandlerTowEx.class);
|
|
|
+ Context ctx = SHRContext.getInstance().getContext();//上下文
|
|
|
+
|
|
|
+ /***
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @param response
|
|
|
+ * @param modelMap
|
|
|
+ * @throws SHRWebException
|
|
|
+ */
|
|
|
+ public void txtDownloadAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
|
|
|
+ String adminOrgId = request.getParameter("adminOrgId");
|
|
|
+ String year = request.getParameter("year");
|
|
|
+ String sql = getSql(adminOrgId, year);
|
|
|
+ logger.error("sql---" + sql);
|
|
|
+ JSONArray jsonArray = new JSONArray();
|
|
|
+ Map map = new HashMap();
|
|
|
+ try {
|
|
|
+ IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
|
|
|
+ while (iRowSet.next()) {
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
+ jsonObject.put("personId", iRowSet.getString("personId"));
|
|
|
+ jsonObject.put("ctbMonth", iRowSet.getString("periodMonth"));
|
|
|
+ jsonObject.put("calNumber", iRowSet.getString("calSchemeNumber"));
|
|
|
+ jsonObject.put("ctbPeriodyear", year);
|
|
|
+ jsonArray.add(jsonObject);
|
|
|
+ }
|
|
|
+ long time = System.currentTimeMillis();
|
|
|
+ HttpSession session = request.getSession();
|
|
|
+ String tempFilePath = UserUtil.getUserTempDirAbsolutePath(session); //存放
|
|
|
+ File tempFile = new File(tempFilePath);
|
|
|
+ if (!tempFile.exists()) {
|
|
|
+ tempFile.mkdirs();
|
|
|
+ }
|
|
|
+ // 创建 FileWriter 对象来写入文本文件
|
|
|
+ String fileName = "output_" + time + ".txt";
|
|
|
+ String txtNameHash = MD5.md5Hash(fileName);
|
|
|
+ String realFileName = getEncryRealFileName(ctx, txtNameHash);
|
|
|
+ String txtPath = tempFilePath + File.separator + realFileName;
|
|
|
+ String fileStr = txtNameHash;
|
|
|
+ FileWriter fileWriter = new FileWriter(txtPath);
|
|
|
+ BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
+ JSONObject jsonObject = (JSONObject) jsonArray.get(i);
|
|
|
+ String personId = (String) jsonObject.get("personId");
|
|
|
+ String ctbPeriodyear = String.valueOf(jsonObject.get("ctbPeriodyear"));//
|
|
|
+ String ctbMonth = String.valueOf(jsonObject.get("ctbMonth"));
|
|
|
+ String calNumber = (String) jsonObject.get("calNumber");//规则名称
|
|
|
+ String dataTxt = getSql(ctx, personId, ctbPeriodyear, ctbMonth, calNumber);
|
|
|
+ bufferedWriter.write(dataTxt);
|
|
|
+ }
|
|
|
+ // 关闭 BufferedWriter
|
|
|
+ bufferedWriter.close();
|
|
|
+ // 关闭 FileWriter
|
|
|
+ fileWriter.close();
|
|
|
+
|
|
|
+ Map<String, String> param = new HashMap<String, String>();
|
|
|
+ param.put("method", "tmp");
|
|
|
+ param.put("file", fileStr);
|
|
|
+ param.put("filename", fileName);
|
|
|
+ String link = DynamicUtil.assembleUrl("/shr/downloadfile.do", param).replaceAll("\\+", "%20");
|
|
|
+ map.put("msgType", "1");
|
|
|
+ map.put("link", link);
|
|
|
+ map.put("msg", "下载成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ map.put("msg", e.getMessage());
|
|
|
+ map.put("msgType", "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ this.writeSuccessData(map);
|
|
|
+
|
|
|
+ //String personId = (String) jsonObject.get("personId");
|
|
|
+ //String ctbPeriodyear = String.valueOf(jsonObject.get("ctbPeriodyear"));//
|
|
|
+ //String ctbMonth = String.valueOf(jsonObject.get("ctbMonth"));
|
|
|
+ //String calNumber = (String) jsonObject.get("calNumber");//规则名称
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ ///**
|
|
|
+ // * 获取sql语句
|
|
|
+ // *
|
|
|
+ // * @param adminOrgId
|
|
|
+ // * @param year
|
|
|
+ // * @return
|
|
|
+ // */
|
|
|
+ //public String getSql(String adminOrgId, String year) {
|
|
|
+ // StringBuilder sb = new StringBuilder();
|
|
|
+ // sb.append("SELECT ").append("\n");
|
|
|
+ // sb.append(" cmpCalTable.FPersonID as personId,").append("\n");
|
|
|
+ // sb.append(" calScheme.fnumber as calSchemeNumber ,").append("\n");
|
|
|
+ // sb.append(" MAX(cmpCalTable.FPeriodMonth) as periodMonth").append("\n");
|
|
|
+ // sb.append("FROM T_HR_SCmpCalTable cmpCalTable").append("\n");
|
|
|
+ // sb.append("INNER JOIN T_HR_SCalScheme calScheme ON calScheme.fid = cmpCalTable.FCalSchemeID").append("\n");
|
|
|
+ // sb.append("WHERE cmpCalTable.FPeriodYear = '" + year + "' ").append("\n");
|
|
|
+ // sb.append(" AND cmpCalTable.FAdminOrgUnitID = '" + adminOrgId + "'").append("\n");
|
|
|
+ // sb.append(" AND calScheme.fnumber IS NOT NULL").append("\n");
|
|
|
+ // sb.append("GROUP BY cmpCalTable.FPersonID, calScheme.fnumber").append("\n");
|
|
|
+ // sb.append("ORDER BY MAX(cmpCalTable.FPeriodMonth) DESC;").append("\n");
|
|
|
+ // return sb.toString();
|
|
|
+ //}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取sql语句
|
|
|
+ *
|
|
|
+ * @param adminOrgId
|
|
|
+ * @param year
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getSql(String adminOrgId, String year) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ sb.append("SELECT ").append("\n");
|
|
|
+ sb.append(" cmpCalTable.FPersonID as personId,").append("\n");
|
|
|
+ sb.append(" calScheme.fnumber as calSchemeNumber ,").append("\n");
|
|
|
+ sb.append(" MAX(cmpCalTable.FPeriodMonth) as periodMonth").append("\n");
|
|
|
+ sb.append("FROM T_HR_SCmpCalTable cmpCalTable").append("\n");
|
|
|
+ sb.append("INNER JOIN T_HR_SCalScheme calScheme ON calScheme.fid = cmpCalTable.FCalSchemeID").append("\n");
|
|
|
+ sb.append("WHERE cmpCalTable.FPeriodYear = '" + year + "' ").append("\n");
|
|
|
+ sb.append(" AND cmpCalTable.FAdminOrgUnitID in").append("\n");
|
|
|
+ sb.append("(").append("\n");
|
|
|
+ sb.append("select child.fid from T_ORG_Admin adcount ").append("\n");
|
|
|
+ sb.append("left join T_ORG_Admin child on (charindex(concat(adcount.flongnumber,'!'),child.flongnumber) = 1 or adcount.flongnumber = child.flongnumber)").append("\n");
|
|
|
+ sb.append("where adcount.fid = '" + adminOrgId + "'").append("\n");
|
|
|
+ sb.append(")").append("\n");
|
|
|
+ sb.append(" AND calScheme.fnumber IS NOT NULL").append("\n");
|
|
|
+ sb.append("GROUP BY cmpCalTable.FPersonID, calScheme.fnumber").append("\n");
|
|
|
+ sb.append("ORDER BY MAX(cmpCalTable.FPeriodMonth) DESC;").append("\n");
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param personId
|
|
|
+ * @param ctbPeriodyear 统计年
|
|
|
+ * @param ctbMonth 统计月
|
|
|
+ * @param calNumber 计算规则
|
|
|
+ */
|
|
|
+ public String getSql(Context ctx, String personId, String ctbPeriodyear, String ctbMonth, String calNumber) throws Exception {
|
|
|
+ SimpleDateFormat outputFormatter = new SimpleDateFormat("ddMMyyyy");
|
|
|
+ StringBuilder query = new StringBuilder();
|
|
|
+ query.append("SELECT").append("\n");
|
|
|
+ query.append("org.Fname_l2 orgName,").append("\n");
|
|
|
+ query.append("org.FCode as orgCode,").append("\n");
|
|
|
+ query.append("person.CFOccupationcode personOccTion,").append("\n");
|
|
|
+ query.append("person.CFChinesesurname personChineX,").append("\n");
|
|
|
+ query.append("person.CFChinesename personChineM,").append("\n");
|
|
|
+ query.append("person.CFPortuguesesurname personPX,").append("\n");
|
|
|
+ query.append("person.CFPortuguesename personPM,").append("\n");
|
|
|
+ query.append("sc.S5 s5,").append("\n");
|
|
|
+ query.append("sc.S94 s93,").append("\n");
|
|
|
+ query.append("res.FBIZDATE bizDate ,").append("\n");
|
|
|
+ query.append("bill.FBILLSTATE status ").append("\n");
|
|
|
+ query.append("FROM T_HR_SCmpCalTable sc ").append("\n");
|
|
|
+ query.append("left join T_HR_SCalScheme ch on sc.FCALSCHEMEID = ch.fid").append("\n");
|
|
|
+ query.append("left join t_hr_personposition pp on sc.FPERSONID = pp.FPERSONID ").append("\n");
|
|
|
+ query.append("left join T_BD_PERSON person on pp.FPERSONID = person.fid ").append("\n");
|
|
|
+ query.append("left join T_Org_admin org on org.fid = pp.FCOMPANYID").append("\n");
|
|
|
+ query.append("left join T_HR_ResignBizBillEntry res on res.FPERSONID = person.fid").append("\n");
|
|
|
+ query.append("left join T_HR_ResignBizBill bill on bill.fid = res.FBILLID \n").append("\n");
|
|
|
+ query.append("where sc.FPERSONID = '" + personId + "' and sc.FPERIODYEAR = '" + ctbPeriodyear + "' and sc.FPERIODMONTH = '" + ctbMonth + "' and ch.FNumber = '" + calNumber + "'").append("\n");
|
|
|
+ logger.error("query---" + query.toString());
|
|
|
+ IRowSet rowSet = DbUtil.executeQuery(ctx, query.toString());
|
|
|
+ String orgCode = "";//雇主编号
|
|
|
+ String taxFile = "";//营业税档案编号或僱主编号文字部份
|
|
|
+
|
|
|
+ String clauseNumber = "32";//职业税条款编号
|
|
|
+ String personOccTion = "";
|
|
|
+ String ChineName = "";
|
|
|
+ String ChinePWName = "";
|
|
|
+ String s5Str = "";
|
|
|
+ String nonMonetary = "";//若有接受非金錢收益
|
|
|
+ String notTaxable = "";//不属课税收益
|
|
|
+ String s93Str = "";
|
|
|
+ String leftStr = "";
|
|
|
+ String txt01 = "01";
|
|
|
+ String txt02 = "12";
|
|
|
+ String reserved = "";
|
|
|
+ while (rowSet.next()) {
|
|
|
+ //orgName = rowSet.getString("orgName");
|
|
|
+ orgCode = rowSet.getString("orgCode");//雇主编号
|
|
|
+ personOccTion = rowSet.getString("personOccTion") == null ? "" : rowSet.getString("personOccTion");//税务编码
|
|
|
+ String personChineX = rowSet.getString("personChineX") == null ? "" : rowSet.getString("personChineX");//中文姓
|
|
|
+ String personChineM = rowSet.getString("personChineM") == null ? "" : rowSet.getString("personChineM");//中文名
|
|
|
+ String personPX = rowSet.getString("personPX") == null ? "" : rowSet.getString("personPX");//葡文姓
|
|
|
+ String personPM = rowSet.getString("personPM") == null ? "" : rowSet.getString("personPM");//葡文名
|
|
|
+ String status = rowSet.getString("status") == null ? "" : rowSet.getString("status");//单据状态
|
|
|
+ BigDecimal s5 = rowSet.getBigDecimal("s5");//应纳税所得额
|
|
|
+ BigDecimal s93 = rowSet.getBigDecimal("s93"); //測試環境 93 职业税s94
|
|
|
+ logger.error("s5---" + s5);
|
|
|
+ logger.error("s93---" + s93);
|
|
|
+ Date bizDate = rowSet.getDate("bizDate");//员工离职日期
|
|
|
+ if (bizDate != null) {
|
|
|
+ leftStr = outputFormatter.format(bizDate);
|
|
|
+ if (!status.equals("3")) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String[] s5split = convertToString(s5).split("\\.");
|
|
|
+ String strS5 = s5split[0];
|
|
|
+ if (StringUtils.isNotBlank(strS5)) {
|
|
|
+// if (convertToBigDecimal(strS5).compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ s5Str += strLengthReturn(strS5, 11, "0", 0);
|
|
|
+// }
|
|
|
+ }
|
|
|
+ if (s5split.length > 1) {
|
|
|
+ s5Str += s5split[1];
|
|
|
+
|
|
|
+ } else {
|
|
|
+ s5Str += "00";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ String[] s93split = convertToString(s93).split("\\.");
|
|
|
+ String strS93 = s93split[0];
|
|
|
+ if (StringUtils.isNotBlank(strS93)) {
|
|
|
+// if (convertToBigDecimal(strS93).compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ s93Str += strLengthReturn(strS93, 11, "0", 0);
|
|
|
+// }
|
|
|
+ }
|
|
|
+ if (s93split.length > 1) {
|
|
|
+ s93Str += s93split[1];
|
|
|
+ } else {
|
|
|
+ s93Str += "00";
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 员工对应组织 的 雇主编号 --7
|
|
|
+ * 营业税档案编号或僱主编号文字部份 空 --1
|
|
|
+ * 员工查询界面 统计年 --4
|
|
|
+ * 职业税条款编号 默认 32 --2
|
|
|
+ * 员工信息--税务编码 --8
|
|
|
+ * 员工信息--中文姓名 (Big-5編碼) --40
|
|
|
+ * 员工信息--葡文姓名 --40
|
|
|
+ * 薪酬核算--应纳税所得额 --13
|
|
|
+ * 若有接受非金钱收益 空 --1
|
|
|
+ * 不属课税收益 空 --13
|
|
|
+ * 薪酬核算--职业税 --13
|
|
|
+ * 员工离职日期 --8
|
|
|
+ * 默认 01 --2
|
|
|
+ * 默认 12 --2
|
|
|
+ * 预留供日后使用 空 --20
|
|
|
+ */
|
|
|
+ ChineName = stringToBig5Bytes(personChineX + personChineM);
|
|
|
+ ChinePWName = personPX + personPM;
|
|
|
+ orgCode = strLengthReturn(orgCode, 7, "0", 0);//雇主编号
|
|
|
+ taxFile = strLengthReturn("", 1, " ", 0);//营业税档案编号或僱主编号文字部份
|
|
|
+
|
|
|
+
|
|
|
+ personOccTion = strLengthReturn(personOccTion, 8, " ", personOccTion.length());//税务编码
|
|
|
+ ChineName = strLengthReturn(ChineName, 40, " ", ChineName.length());//中文姓名
|
|
|
+ ChinePWName = strLengthReturn(ChinePWName, 40, " ", ChinePWName.length());//葡文姓名
|
|
|
+ //s5 = strLengthReturn(removeTrailingZeros(s5),13,"0",0);//应纳税所得额
|
|
|
+ nonMonetary = strLengthReturn("", 1, " ", 0);//若有接受非金錢收益
|
|
|
+ notTaxable = strLengthReturn("", 13, "0", 0);//不属课税收益
|
|
|
+ //s93 = strLengthReturn(removeTrailingZeros(s93),13,"0",0);//职业税
|
|
|
+ leftStr = strLengthReturn(leftStr, 8, " ", leftStr.length());//员工离职日期
|
|
|
+
|
|
|
+
|
|
|
+ reserved = strLengthReturn("", 20, " ", 0);//预留供日后使用
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return orgCode + taxFile + ctbPeriodyear + clauseNumber + personOccTion + ChineName + ChinePWName + s5Str + nonMonetary + notTaxable + s93Str + leftStr + txt01 + txt02 + reserved + "\n";
|
|
|
+ }
|
|
|
+}
|