commit a2efb37e34ca7a344c1ef2ce452a70cbb9cec038 Author: 黄正国 <438926402@qq.com> Date: Thu Nov 27 16:56:00 2025 +0800 2025-11-27仓库创建 diff --git a/v5/apps-customize/pom.xml b/v5/apps-customize/pom.xml new file mode 100644 index 0000000..968bb48 --- /dev/null +++ b/v5/apps-customize/pom.xml @@ -0,0 +1,77 @@ + + + + + com.seeyon + apps-root + 5371630367615140082-standard-V8.1SP2-release_20220812-SNAPSHOT + + + 4.0.0 + + apps-customize + ${apps.version} + + + com.seeyon + cip-service + ${cip.version} + + + open.seeyon.3rd + seeyon-extend + 3.2 + system + ${basedir}/src/main/webapp/WEB-INF/lib/seeyon-extend-v3.0.jar + + + open.seeyon.3rd + hutool + 5.3.9 + system + ${basedir}/src/main/webapp/WEB-INF/lib/customer/hutool-all-5.3.9.jar + + + open.seeyon.3rd + commons-dbutils + 1.6 + system + ${basedir}/src/main/webapp/WEB-INF/lib/commons-dbutils-1.6.jar + + + com.seeyon + ctp-workflow + ${ctp.version} + + + com.seeyon + apps-collaboration + ${apps.version} + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/BIPCommonNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/BIPCommonNode.java new file mode 100644 index 0000000..85c2c32 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/BIPCommonNode.java @@ -0,0 +1,107 @@ +package com.seeyon.apps.bip; + +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.bip.util.BipHttpUtil; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public abstract class BIPCommonNode extends ACommonSuperNode { + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + public ConfigVo getBipConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + SuperNodeContext context = new SuperNodeContext(); + try { + FieldDataVo fhjg = formDataVo.getFieldData("BIP返回结果"); + String value = fhjg.getStringValue(); + if(value.startsWith("推送BIP成功")) { + return context.success("跳过:" + value); + } + } catch (Exception e) { + + } + ConfigVo configVo = getBipConfig(); + context.setNeedSave(true); + String url = configVo.getParamVal(BipConstants.bipUrl.name()); + url += getMethod(); + context.setRequest(request); + context.setUrl(url); + try { + String response = BipHttpUtil.doPost(url, request, configVo.getParamVal(BipConstants.clientId.name()), configVo.getParamVal(BipConstants.client_security.name())); + context.setResponse(response); + BipResponse bipResponse = BipHttpUtil.parseResponse(response); + if(bipResponse.isSuccess()) { + if("updateZhuanzuJinNode".equals(getNodeId())){ + FieldDataVo fhjg = formDataVo.getFieldData("BIP返回结果"); + String value = fhjg.getStringValue(); + String bipReturn = "推送BIP成功:" + value+";保证金转租金推送:"+bipResponse.getMsg(); + formDataVo.getNewFieldDataMap().put("BIP返回结果", bipReturn); + }else if("updateBaozhengJinNode".equals(getNodeId())){ + FieldDataVo fhjg = formDataVo.getFieldData("BIP返回结果"); + String value = fhjg.getStringValue(); + String bipReturn = "推送BIP成功:" + value+";租赁合同收款(浮动租金)回写:"+bipResponse.getMsg(); + formDataVo.getNewFieldDataMap().put("BIP返回结果", bipReturn); + }else{ + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:" + bipResponse.getMsg()); + } + context.success("推送BIP成功:" + bipResponse.getMsg(), false); + } else { + context.setErrMsg(bipResponse.getMsg()); + context.setException(true); + context.back("推送BIP失败:" + bipResponse.getMsg()); + if(!("updateZhuanzuJinNode".equals(getNodeId()) || "updateBaozhengJinNode".equals(getNodeId()))){ + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP失败:" + bipResponse.getMsg()); + } + } + } catch (Exception e) { + context.setException(true); + context.back("推送BIP失败:OA处理异常:" + e.getMessage()); + if(!("updateZhuanzuJinNode".equals(getNodeId()) || "updateBaozhengJinNode".equals(getNodeId()))){ + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP失败:OA处理异常" + e.getMessage()); + } + + } + return context; + } + + + public abstract String getMethod(); +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/NccPluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/NccPluginApi.java new file mode 100644 index 0000000..f8df5f2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/NccPluginApi.java @@ -0,0 +1,40 @@ +package com.seeyon.apps.bip; + +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class NccPluginApi extends APluginInfoApi { + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return "致威互联"; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (BipConstants value : BipConstants.values()) { + if(value != BipConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/aop/BpmProcessAop.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/aop/BpmProcessAop.java new file mode 100644 index 0000000..c710503 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/aop/BpmProcessAop.java @@ -0,0 +1,220 @@ +package com.seeyon.apps.bip.aop; + +import cn.hutool.core.convert.Convert; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormFieldComEnum; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.bo.*; +import com.seeyon.ctp.organization.manager.OrgManager; +import org.apache.commons.collections.ListUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 功能描述:
+ *
+ *  处理数据
+ *  转换相关参数
+ *  部门编码--> 部门
+ *  单位编码--> 单位
+ *  人员编码--> 人员
+ *  岗位编号--> 岗位
+ * 
+ * + * @Author: FanGaowei + * @Date: 2021/9/17 + */ +@Aspect +public class BpmProcessAop { + + @Inject + private FormApi4Cap4 formApi4Cap4; + @Inject + private EnumManager enumManagerNew; + @Inject + private OrgManager orgManager; + + private static final Log log = LogFactory.getLog(BpmProcessAop.class); + + @Pointcut("execution(public * com.seeyon.apps.collaboration.manager.CollaborationBPMHandlerImpl.transPreStartProcess(..))") + private void dealParam() { + } + + @Around(value = "dealParam()") + public Object dealFormData(ProceedingJoinPoint joinPoint) throws Throwable { + log.info("处理数据问题!!"); + Object[] args = joinPoint.getArgs(); + try { + Map params = (Map) args[0]; + Map data = (Map) params.get("data"); + // 开始处理表单数据 + FormBean formBean = formApi4Cap4.getFormByFormCode((String) params.get("templateCode"));; + Map masterData = (Map) data.get("masterTable"); + Map record = (Map) masterData.get("record"); + List> fields = (List>) record.get("fields"); + List> fieldsClone = new ArrayList<>(); + for (Map field : fields) { + String val = field.get("value"); + if(StringUtils.isNotBlank(val)) { + FormFieldBean fieldBean = formBean.getFieldBeanByName(field.get("name")); + if(null != fieldBean) { + field.put("value", dealParams(fieldBean, val)); + } + } + fieldsClone.add(field); + } + // 主表字段处理完成 + record.put("fields", fieldsClone); + masterData.put("record", record); + data.put("masterTable", masterData); + // 处理明细表字段 + List> subTables = (List>) data.get("subTables"); + if(null != subTables) { + log.info("开始处理明细表数据"); + try { + List> subTablesClone = new ArrayList<>(); + subTables.forEach(row -> { + List> subRecords = (List>) row.get("records"); + List> newSubRecords = new ArrayList<>(); + subRecords.forEach(subrecord -> { + List> subFields = (List>) subrecord.get("fields"); + List> subFieldsClone = new ArrayList<>(); + for (Map field : subFields) { + String val = field.get("value"); + if(StringUtils.isNotBlank(val)) { + FormFieldBean fieldBean = formBean.getFieldBeanByName(field.get("name")); + if(null != fieldBean) { + field.put("value", dealParams(fieldBean, val)); + } + } + subFieldsClone.add(field); + } + subrecord.put("fields", subFieldsClone); + newSubRecords.add(subrecord); + row.put("records", newSubRecords); + }); + subTablesClone.add(row); + }); + data.put("subTables", subTablesClone); + } catch (Exception e) { + log.error("处理失败:" + e.getMessage()); + } + } + params.put("data", data); + args[0] = params; + + } catch (Exception e) { + // ignore + log.error("处理数据发生异常:", e); + } + return joinPoint.proceed(args); + } + + private String dealParams(FormFieldBean field, String val) { + FormFieldComEnum inputTypeEnum = field.getInputTypeEnum(); + try { + switch (inputTypeEnum) { + case RADIO: + case SELECT: + String code = Convert.toStr(val); + if (StringUtils.isBlank(code)) { + val = null; + } + CtpEnumItem item = enumManagerNew .getItemByCode(code); + if (null == item) { + long enumId = field.getEnumId(); + List emumItems = enumManagerNew.getEmumItemByEmumId(enumId); + if (null != emumItems) { + for (CtpEnumItem emumItem : emumItems) { + if (emumItem.getShowvalue().equals(code)) { + val = emumItem.getId() + ""; + break; + } + } + } + log.error("枚举不存在:" + val); + val = null; + } else { + val = item.getId() + ""; + } + break; + case EXTEND_MEMBER: + //V3xOrgMember member = orgManager.getMemberByLoginName(val); + List memberList = orgManager.getEntityListNoRelation(V3xOrgMember.class.getSimpleName(), + "code", val, null); + log.info("人员转换:" + val + ",查询结果:" + (memberList != null && memberList.size() > 0)); + if(memberList != null&&! ListUtils.EMPTY_LIST.equals(memberList)){ + for (V3xOrgEntity v3xOrgEntity : memberList) { + V3xOrgMember member = (V3xOrgMember) v3xOrgEntity; + if(val.equals(member.getCode())){ + val = member.getId() + ""; + break; + } + } + } + break; + case EXTEND_ACCOUNT: + List accList = orgManager.getEntityListNoRelation(V3xOrgAccount.class.getSimpleName(), + "code", val, null); + log.info("单位值转换:" + val + ",查询结果:" + (accList != null && accList.size() > 0)); + if(accList != null&&! ListUtils.EMPTY_LIST.equals(accList)){ + for (V3xOrgEntity acc : accList) { + V3xOrgAccount account = (V3xOrgAccount) acc; + if(val.equals(account.getCode())){ + val = account.getId() + ""; + break; + } + } + } + break; + case EXTEND_DEPARTMENT: + List deptList = orgManager.getEntityListNoRelation(V3xOrgDepartment.class.getSimpleName(), + "code", val, null); + log.info("部门值转换:" + val + ",查询结果:" + (deptList != null && deptList.size() > 0)); + if(deptList != null&&! ListUtils.EMPTY_LIST.equals(deptList)){ + for (V3xOrgEntity v3xOrgEntity : deptList) { + V3xOrgDepartment dept = (V3xOrgDepartment) v3xOrgEntity; + if(val.equals(dept.getCode())){ + val = dept.getId() + ""; + break; + } + } + } + break; + case EXTEND_POST: + List postlist = orgManager.getEntityListNoRelation(V3xOrgPost.class.getSimpleName(), + "code", val, null); + log.info("岗位转换:" + val + ",查询结果:" + (postlist != null && postlist.size() > 0)); + if(postlist != null&&! ListUtils.EMPTY_LIST.equals(postlist)){ + for (V3xOrgEntity v3xOrgEntity : postlist) { + V3xOrgPost post = (V3xOrgPost) v3xOrgEntity; + if(val.equals(post.getCode())){ + val = post.getId() + ""; + break; + } + } + } + break; + default: + break; + } + } catch (Exception e) { + log.error("处理字段异常:" + field.getName()+ "," + field.getDisplay()); + } + return val; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/constants/BipConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/constants/BipConstants.java new file mode 100644 index 0000000..ed0e5f2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/constants/BipConstants.java @@ -0,0 +1,35 @@ +package com.seeyon.apps.bip.constants; + +public enum BipConstants { + + plugin("bip","插件ID"), + bipUrl("http://10.1.90.21:9083", "BIP地址"), + bipWageUrl("/servlet/ApproveTodo?usercode=${code}&salary=60656013p&v5ticket=", "BIP工资详情URL"), + ssoUrl("http://10.1.90.21:9083", "BIP SSO地址"), + //bipWaiwangUrl("http://bip.hbsxly.com", "BIP地址"), + clientId("OA", "clientId"), + client_security("30dcf9a3cfef4b98a157e926db6369f0", "client_security"), + dsname("BIPKF", "dsname"), + busicentercode("sxbip", "busicentercode"); + + BipConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/FukuanContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/FukuanContractNode.java new file mode 100644 index 0000000..397e4d9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/FukuanContractNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.contract.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.3.1OA付款合同同步BIP付款合同接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class FukuanContractNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_receivecontract"; + } + + @Override + public String getNodeId() { + return "fukuanContractNode"; + } + + @Override + public String getNodeName() { + return "付款合同同步BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/ShoukuanContractrefundNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/ShoukuanContractrefundNode.java new file mode 100644 index 0000000..2b964c4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/ShoukuanContractrefundNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.contract.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.3.2OA一般收款合同变更同步BIP收款合同接口
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2023/01/15 + */ +public class ShoukuanContractrefundNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/servlet/RefundOrderServlet"; + } + + @Override + public String getNodeId() { + return "shoukuanContractrefundNode"; + } + + @Override + public String getNodeName() { + return "OA一般收款合同退款同步BIP收款合同"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/UpdateFukuanContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/UpdateFukuanContractNode.java new file mode 100644 index 0000000..6090380 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/UpdateFukuanContractNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.contract.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.3.2OA一般付款合同变更同步BIP付款合同接口
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2023/12/29 + */ +public class UpdateFukuanContractNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/servlet/UpdatePaymentContract"; + } + + @Override + public String getNodeId() { + return "updateFukuanContractNode"; + } + + @Override + public String getNodeName() { + return "OA一般付款合同变更同步BIP付款合同"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/UpdateShoukuanContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/UpdateShoukuanContractNode.java new file mode 100644 index 0000000..57dfd74 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/UpdateShoukuanContractNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.contract.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.3.2OA一般收款合同变更同步BIP收款合同接口
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2023/12/29 + */ +public class UpdateShoukuanContractNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/servlet/UpdateGatheringContract"; + } + + @Override + public String getNodeId() { + return "updateShoukuanContractNode"; + } + + @Override + public String getNodeName() { + return "OA一般收款合同变更同步BIP收款合同"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/ZulinContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/ZulinContractNode.java new file mode 100644 index 0000000..c1e55b4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/contract/node/ZulinContractNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.contract.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.3.2OA租赁合同同步BIP收款合同接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class ZulinContractNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_receivecontract"; + } + + @Override + public String getNodeId() { + return "zulinContractNode"; + } + + @Override + public String getNodeName() { + return "租赁合同同步BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/LogDownloadController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/LogDownloadController.java new file mode 100644 index 0000000..396da37 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/LogDownloadController.java @@ -0,0 +1,79 @@ +package com.seeyon.apps.bip.ctrl; + +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.seeyon.ctp.common.SystemEnvironment; +import org.springframework.web.servlet.ModelAndView; + +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.encrypt.CoderFactory; +import com.seeyon.ctp.common.filemanager.manager.FileManager; +import com.seeyon.ctp.common.po.filemanager.V3XFile; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.NeedlessCheckLogin; + +public class LogDownloadController extends BaseController { + + + //公文正文MimeType + private static String docLongType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + private static String docType = "application/msword"; + private static String excelType = "application/vnd.ms-excel"; + + private FileManager fileManager; + + public FileManager getFileManager() { + return fileManager; + } + + public void setFileManager(FileManager fileManager) { + this.fileManager = fileManager; + } + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception { + String date = request.getParameter("date"); + String num = request.getParameter("num"); + String name = request.getParameter("name"); + File file; + String fileName = ""; + String logsFolder = SystemEnvironment.getLogsFolder(); + if (null == date) { + fileName = logsFolder + name + ".log"; + } else { + fileName = logsFolder + date + "/" + name + "." + date + "." + num + ".log"; + } + file = new File(fileName); + if(!file.exists()) { + super.rendJavaScript(response, "alert('日志文件不存在');"); + return null; + } + response.setContentType("application/force-download");// 扢离Ч秶狟婥祥湖羲 + response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(name + ".log", "UTF-8")); + FileInputStream fin = null; + OutputStream os = null; + try { + os = response.getOutputStream(); + fin = new FileInputStream(file); + CoderFactory.getInstance().download(fin, os); + } catch (Exception e) { + throw e; + } finally { + if (fin != null) { + fin.close(); + } + if (os != null) { + os.close(); + } + } + return null; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/NccSsoController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/NccSsoController.java new file mode 100644 index 0000000..ecfef85 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/NccSsoController.java @@ -0,0 +1,79 @@ +package com.seeyon.apps.bip.ctrl; + +import cn.hutool.http.HttpRequest; +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.bip.util.BipHttpUtil; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.taglibs.functions.Functions; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerImpl; +import com.seeyon.ctp.util.Strings; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class NccSsoController extends BaseController { + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + + + @Override + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception { + + ConfigVo config = cstConfigApi.getConfig(BipConstants.getPluginId()); + String url = config.getParamVal(BipConstants.ssoUrl.name()); +// 获取当前登录人ID AppContext.currentUserId() +// OrgManager orgManager = new OrgManagerImpl(); +// orgManager.getMemberById(AppContext.currentUserId());根据人员ID获取人员信息 + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(AppContext.currentUserId()); + if(null == addressBook) { + super.rendJavaScript(response, "alert('BIP账号未维护,无法单点登录!');"); + return null; + } + String code = addressBook.getExtAttr2(); + if(Strings.isBlank(code)) { + super.rendJavaScript(response, "alert('BIP账号未维护,无法单点登录!');"); + return null; + } + // 获取token走内网地址 + String interUrl = config.getParamVal(BipConstants.bipUrl.name()); + String tokenUrl = interUrl + "/servlet/NCTokenServlet?dsname=" + config.getParamVal(BipConstants.dsname.name()) + + "&usercode=" + code + "&system=OA&busicentercode=" + config.getParamVal(BipConstants.busicentercode.name()); + try { + String body = HttpRequest.get(tokenUrl).execute().body(); + BipResponse bipResponse = BipHttpUtil.parseResponse(body); + if(bipResponse.isSuccess()) { + String ssoUrl = url + "/nccloud/resources/uap/rbac/thirdpartylogin/main/index.htmlac?cesstoken=" + bipResponse.getData() + + "&redirect_uri=" + url + "/nccloud"; + response.sendRedirect(ssoUrl); + } else { + super.rendJavaScript(response, "alert('单点登录错误:" + bipResponse.getMsg() + "');"); + } + } catch (Exception e) { + logger.error("单点登录异常", e); + super.rendJavaScript(response, "alert('后台发生错误');"); + } + return null; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/NccWageSsoController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/NccWageSsoController.java new file mode 100644 index 0000000..7ec5f75 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/ctrl/NccWageSsoController.java @@ -0,0 +1,79 @@ +package com.seeyon.apps.bip.ctrl; + +import cn.hutool.http.HttpRequest; +import cn.hutool.log.Log; +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.bip.util.BipHttpUtil; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.util.Strings; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class NccWageSsoController extends BaseController { + + private static Log log = Log.get(NccWageSsoController.class); + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + + @Override + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception { + StringBuffer localUrl = request.getRequestURL(); + String v5ticket = request.getParameter("ticket"); + ConfigVo config = cstConfigApi.getConfig(BipConstants.getPluginId()); + String url = config.getParamVal(BipConstants.ssoUrl.name()); + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(AppContext.currentUserId()); + if(null == addressBook) { + super.rendJavaScript(response, "alert('BIP账号未维护,无法单点登录!');"); + return null; + } + String code = addressBook.getExtAttr2(); + if(Strings.isBlank(code)) { + super.rendJavaScript(response, "alert('BIP账号未维护,无法单点登录!');"); + return null; + } + // 获取token走内网地址 + String interUrl = config.getParamVal(BipConstants.bipUrl.name()); + String tokenUrl = interUrl + "/servlet/NCTokenServlet?dsname=" + config.getParamVal(BipConstants.dsname.name()) + + "&usercode=" + code + "&system=OA&busicentercode=" + config.getParamVal(BipConstants.busicentercode.name()); + try { + String body = HttpRequest.get(tokenUrl).execute().body(); + BipResponse bipResponse = BipHttpUtil.parseResponse(body); + if(bipResponse.isSuccess()) { +// String ssoUrl = url + "/nccloud/resources/uap/rbac/thirdpartylogin/main/index.html?accesstoken=" + bipResponse.getData() +// + "&redirect_uri=" + url + "/servlet/ApproveTodo?usercode="+ code +"&salary=60656013p&v5ticket="+v5ticket; + String ssoUrl = url +config.getParamVal(BipConstants.bipWageUrl.name())+v5ticket; +// String ssoUrl = url + "/nccloud/resources/uap/rbac/thirdpartylogin/main/index.html?accesstoken=" + bipResponse.getData() +// + "&redirect_uri=" + url + config.getParamVal(BipConstants.bipWageUrl.name())+v5ticket; + ssoUrl = ssoUrl.replace("${code}",code); + System.out.println(ssoUrl); + response.sendRedirect(ssoUrl); + } else { + super.rendJavaScript(response, "alert('单点登录错误:" + bipResponse.getMsg() + "');"); + } + } catch (Exception e) { + logger.error("单点登录异常", e); + super.rendJavaScript(response, "alert('后台发生错误');"); + } + return null; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/custom/node/AddCustomerNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/custom/node/AddCustomerNode.java new file mode 100644 index 0000000..04def02 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/custom/node/AddCustomerNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.custom.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/19 + */ +public class AddCustomerNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_customerServlet"; + } + + @Override + public String getNodeId() { + return "addCustomerNode"; + } + + @Override + public String getNodeName() { + return "新增客商推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/FeiQicheRongziApplyNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/FeiQicheRongziApplyNode.java new file mode 100644 index 0000000..18d4931 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/FeiQicheRongziApplyNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.feiyong.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.2.8非汽车板块融资申请表同步信贷申请单接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/5 + */ +public class FeiQicheRongziApplyNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_debitApplyServlet"; + } + + @Override + public String getNodeId() { + return "feiQicheRongziApplyNode"; + } + + @Override + public String getNodeName() { + return "非汽车板块融资申请推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/HuazhangJiesuanNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/HuazhangJiesuanNode.java new file mode 100644 index 0000000..5000959 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/HuazhangJiesuanNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.feiyong.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.2.6划账结算单同步划账结算单接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/5 + */ +public class HuazhangJiesuanNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_transformServlet"; + } + + @Override + public String getNodeId() { + return "huazhangJiesuanNode"; + } + + @Override + public String getNodeName() { + return "划账结算单推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/QicheRongziApplyNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/QicheRongziApplyNode.java new file mode 100644 index 0000000..a115563 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/QicheRongziApplyNode.java @@ -0,0 +1,37 @@ +package com.seeyon.apps.bip.feiyong.node; + +import com.seeyon.apps.bip.BIPCommonNode; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.bip.util.BipHttpUtil; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; + +/** + * 功能描述:
+ *
+ * 2.2.8非汽车板块融资申请表同步信贷申请单接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/5 + */ +public class QicheRongziApplyNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_debitApplyServlet"; + } + + @Override + public String getNodeId() { + return "qicheRongziApplyNode"; + } + + @Override + public String getNodeName() { + return "汽车板块融资申请推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/ShangShouXiaboNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/ShangShouXiaboNode.java new file mode 100644 index 0000000..70a9aca --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/ShangShouXiaboNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.feiyong.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.2.5资金上收下拨审批单同步下拨单接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class ShangShouXiaboNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_allocationServlet"; + } + + @Override + public String getNodeId() { + return "shangShouXiaboNode"; + } + + @Override + public String getNodeName() { + return "资金上收下拨推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/WuyeshoufeiNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/WuyeshoufeiNode.java new file mode 100644 index 0000000..dc38069 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/feiyong/node/WuyeshoufeiNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.feiyong.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ * 2.2.7物业收费结算单同步收款单接口
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class WuyeshoufeiNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_gatherbillServlet"; + } + + @Override + public String getNodeId() { + return "wuyeshoufeiNode"; + } + + @Override + public String getNodeName() { + return "物业收费结算单推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchLizhiStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchLizhiStopEvent.java new file mode 100644 index 0000000..6f3e8a2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchLizhiStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class BatchLizhiStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "batchLizhiStopEvent"; + } + + @Override + public String getLabel() { + return "BIP批量离职单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchRuzhiStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchRuzhiStopEvent.java new file mode 100644 index 0000000..d38f778 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchRuzhiStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class BatchRuzhiStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "batchRuzhiStopEvent"; + } + + @Override + public String getLabel() { + return "BIP批量入职单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchZhuanzhengStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchZhuanzhengStopEvent.java new file mode 100644 index 0000000..a463753 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/BatchZhuanzhengStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class BatchZhuanzhengStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "batchZhuanzhengStopEvent"; + } + + @Override + public String getLabel() { + return "BIP批量转正单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/DiaopeiStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/DiaopeiStopEvent.java new file mode 100644 index 0000000..3581c4d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/DiaopeiStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class DiaopeiStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "diaopeiStopEvent"; + } + + @Override + public String getLabel() { + return "BIP调配单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/HrCommonEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/HrCommonEvent.java new file mode 100644 index 0000000..5c736c2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/HrCommonEvent.java @@ -0,0 +1,80 @@ +package com.seeyon.apps.bip.hr.event; + +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.bip.util.BipHttpUtil; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.event.ACommonWorkflowEvent; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.WorkflowEventContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public abstract class HrCommonEvent extends ACommonWorkflowEvent { + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + public abstract String getMethod(); + + @Override + protected WorkflowEventContext proceed(String request, FormDataVo formDataVo, WorkFlowType workFlowType, FormDataMasterBean formDataMasterBean) throws Exception { + WorkflowEventContext context = new WorkflowEventContext(); + ConfigVo configVo = cstConfigApi.getConfig(getPluginId()); + context.setNeedSave(true); + String url = configVo.getParamVal(BipConstants.bipUrl.name()); + url += getMethod(); + context.setRequest(request); + context.setUrl(url); + try { + String response = BipHttpUtil.doPost(url, request, configVo.getParamVal(BipConstants.clientId.name()), configVo.getParamVal(BipConstants.client_security.name())); + context.setResponse(response); + BipResponse bipResponse = BipHttpUtil.parseResponse(response); + if(bipResponse.isSuccess()) { + context.setSuccess(true); + context.setErrMsg("推送BIP成功:" + bipResponse.getMsg()); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:" + bipResponse.getMsg()); + } else { + if("当前操作人没有待办任务.".equals(bipResponse.getMsg())){ + context.setSuccess(true); + context.setErrMsg("推送BIP成功:" + bipResponse.getMsg()); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:" + bipResponse.getMsg()); + }else{ + context.setSuccess(false); + context.setErrMsg("推送BIP失败:" + bipResponse.getMsg()); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP失败:" + bipResponse.getMsg()); + } + } + } catch (Exception e) { + context.setSuccess(false); + context.setErrMsg("推送BIP失败:OA处理异常:" + e.getMessage()); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP失败:OA处理异常" + e.getMessage()); + } + return context; + } + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] { WorkFlowType.onBeforeStop }; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/LizhiStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/LizhiStopEvent.java new file mode 100644 index 0000000..adb7b9c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/LizhiStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class LizhiStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "lizhiStopEvent"; + } + + @Override + public String getLabel() { + return "BIP离职单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/NeibujianzhiStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/NeibujianzhiStopEvent.java new file mode 100644 index 0000000..f7d9891 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/NeibujianzhiStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class NeibujianzhiStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "neibujianzhiStopEvent"; + } + + @Override + public String getLabel() { + return "BIP内部兼职单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/RuzhiStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/RuzhiStopEvent.java new file mode 100644 index 0000000..3841c38 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/RuzhiStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class RuzhiStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "ruzhiStopEvent"; + } + + @Override + public String getLabel() { + return "BIP入职单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/ZhuanzhengStopEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/ZhuanzhengStopEvent.java new file mode 100644 index 0000000..3b82615 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/event/ZhuanzhengStopEvent.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.bip.hr.event; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/2/22 + */ +public class ZhuanzhengStopEvent extends HrCommonEvent { + + @Override + public String getId() { + return "zhuanzhengStopEvent"; + } + + @Override + public String getLabel() { + return "BIP转正单事件"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchLizhiApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchLizhiApproveBipHrNode.java new file mode 100644 index 0000000..51cb6b0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchLizhiApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class BatchLizhiApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "batchLizhiApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR批量离职审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchRuzhiApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchRuzhiApproveBipHrNode.java new file mode 100644 index 0000000..5cf8c1d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchRuzhiApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class BatchRuzhiApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "batchRuzhiApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR批量入职审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchZhuanzhengApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchZhuanzhengApproveBipHrNode.java new file mode 100644 index 0000000..6f9cc64 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/BatchZhuanzhengApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class BatchZhuanzhengApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "batchZhuanzhengApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR批量转正审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/DiaopeiApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/DiaopeiApproveBipHrNode.java new file mode 100644 index 0000000..74c62a7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/DiaopeiApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class DiaopeiApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "diaopeiApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR调配审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/LizhiApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/LizhiApproveBipHrNode.java new file mode 100644 index 0000000..21afad8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/LizhiApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class LizhiApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "lizhiApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR离职审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/NeibujianzhiApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/NeibujianzhiApproveBipHrNode.java new file mode 100644 index 0000000..dd89106 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/NeibujianzhiApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class NeibujianzhiApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "neibujianzhiApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR内部兼职审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/RuzhiApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/RuzhiApproveBipHrNode.java new file mode 100644 index 0000000..34b4d29 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/RuzhiApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class RuzhiApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "ruzhiApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR入职审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/WaibujianzhiNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/WaibujianzhiNode.java new file mode 100644 index 0000000..f557473 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/WaibujianzhiNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/30 + */ +public class WaibujianzhiNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_external_part_time_job"; + } + + @Override + public String getNodeId() { + return "waibujianzhiNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR外部兼职数据回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/ZhuanzhengApproveBipHrNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/ZhuanzhengApproveBipHrNode.java new file mode 100644 index 0000000..7619840 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/hr/node/ZhuanzhengApproveBipHrNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.hr.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/7 + */ +public class ZhuanzhengApproveBipHrNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_hrresultacceptance"; + } + + @Override + public String getNodeId() { + return "zhuanzhengApproveBipHrNode"; + } + + @Override + public String getNodeName() { + return "BIP-HR转正审批通过结果回传"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/QixinSyncQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/QixinSyncQuartz.java new file mode 100644 index 0000000..267c1c5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/QixinSyncQuartz.java @@ -0,0 +1,275 @@ +package com.seeyon.apps.bip.quartz; + +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.workflow.util.FormDataBeanUtil; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.mplus.api.MplusApi; +import com.seeyon.cap4.bizportalold.util.HttpClientUtil; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.fieldCtrl.enums.CreditQueryConstant; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.json.JSONUtil; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.inject.Inject; +import java.io.File; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.seeyon.cap4.form.bean.fieldCtrl.enums.CreditQueryConstant.Category.*; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2024/1/8 + */ +public class QixinSyncQuartz extends AbstractQuartzTask { + + private static final Log LOGGER = LogFactory.getLog(QixinSyncQuartz.class); + + private static final Integer ENTERPRISE_INFO_EXACT_BUSINESS = 11; + private static final Integer ENTERPRISE_INFO_EXACT_INSTITUTION = 12; + private static final Integer ENTERPRISE_INFO_EXACT_LAW = 13; + + + final String serviceCode = "m20000000000003002"; + + @Inject + private MplusApi mplusApi; + @Inject + private FormApi4Cap4 formApi4Cap4; + + @Override + public String taskRun(String param) throws Exception { + /* String path = SystemEnvironment.getLogsFolder() + "gongshang.log"; + FileUtils.writeStringToFile(new File(path), JSONUtil.toJSONString(getCreditQueryInfo(param)), "UTF-8");*/ + AtomicInteger success = new AtomicInteger(0); + AtomicInteger error = new AtomicInteger(0); + Vector syncMsgs = new Vector(); + FormBean formBean = formApi4Cap4.getFormByFormCode("inner_gs"); + String sql = "select id from " + formBean.getMasterTableBean().getTableName(); + // 根据税号查询数据 + try(JDBCAgent agent = new JDBCAgent(true, false)) { + agent.execute(Strings.isNotBlank(param) ? param : sql); + List> list = agent.resultSetToList(); + list.parallelStream().forEach(row -> { + Long id = Convert.toLong(row.get("id")); + try { + FormDataMasterBean masterBean = formApi4Cap4.getDataMasterBeanById(id, formBean, null); + + // 处理数据 + FormDataVo formDataVo = FormDataBeanUtil.trans2FormDataVo(BipConstants.getPluginId(), + formBean.getId(), null, formBean, masterBean); + + // 获取税号字段 + String sh = formDataVo.getFieldData("验证税号").getStringValue(); + + JSONObject res = getCreditQueryInfo(sh); + /* String s = FileUtils.readFileToString(new File("/Users/kkdo/zcseeyon/05 伙伴项目/12 湖北橙阳科技有限公司/01 三峡旅游集团有限公司/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/data.json"), + "utf-8"); + JSONObject res = JSONUtil.parseJSONString(s, JSONObject.class); + // 数据更新*/ + JSONObject baseInfo = res.getJSONObject("business_info"); + formDataVo.getNewFieldDataMap().put("客商名称", baseInfo.getString("name")); + + String address = baseInfo.getString("address"); + if(Strings.isBlank(address)) { + address = "空"; + } + formDataVo.getNewFieldDataMap().put("客户详细地址", address); + formDataVo.getNewFieldDataMap().put("详细地址_F", address); + formDataVo.getNewFieldDataMap().put("企业类型", baseInfo.getString("org_type")); + formDataVo.getNewFieldDataMap().put("实缴资本", baseInfo.getString("actual_capi")); + String regCapi = baseInfo.getString("reg_capi"); + formDataVo.getNewFieldDataMap().put("注册资本", regCapi.substring(0,regCapi.length()-3)); + + // 处理高管信息 + List gaoguan = formDataVo.getSubFormMap().get("高管详细信息表"); + Map gaoguanMap = + gaoguan.stream().collect(Collectors.toMap(sub -> { + try { + return sub.getFieldData("主要成员姓名").getStringValue(); + } catch (NoSuchFieldException e) { + return "error"; + } + }, Function.identity(),(key1, key2)->key2)); + + JSONArray gaoguanArr = res.getJSONArray("employees"); + + for (int i = 0; i < gaoguanArr.size(); i++) { + JSONObject gaoguanInfo = gaoguanArr.getJSONObject(i); + FormDataVo gaoguanVo = gaoguanMap.get(gaoguanInfo.getString("name")); + + if(null == gaoguanVo) { + // 新增一行 处理一下空行的问题 + FormDataVo formDataVo1 = gaoguanMap.get(""); + if(null != formDataVo1) { + formDataVo1.getNewFieldDataMap().put("主要成员姓名", gaoguanInfo.getString("name")); + formDataVo1.getNewFieldDataMap().put("主要成员职务", gaoguanInfo.getString("job_title")); + gaoguanMap.remove(""); + } else { + Map fieldMap = new HashMap<>(); + fieldMap.put("主要成员姓名", gaoguanInfo.getString("name")); + fieldMap.put("主要成员职务", gaoguanInfo.getString("job_title")); + FormDataBeanUtil.addNewRow("高管详细信息表", formDataVo, fieldMap, masterBean); + } + } else { + gaoguanVo.getNewFieldDataMap().put("主要成员职务", gaoguanInfo.getString("job_title")); + } + } + + // 工商变更信息 + JSONArray array = res.getJSONArray("changerecords"); + List changerecords = formDataVo.getSubFormMap().get("工商变更明细"); + + + Map changeMap = + changerecords.stream().collect(Collectors.toMap(sub -> { + try { + return sub.getFieldData("工商变更项目").getStringValue() + sub.getFieldData("变更日期").getStringValue(); + } catch (NoSuchFieldException e) { + return "error"; + } + }, Function.identity(),(key1, key2)->key2)); + + // 遍历 + for (int i = 0; i < array.size(); i++) { + JSONObject record = array.getJSONObject(i); + String type = record.getString("change_item"); + String changeDate = record.getString("change_date"); + String unique = type + changeDate; + + FormDataVo changeRow = changeMap.get(unique); + + if(null == changeRow) { + // 新增一行 + + FormDataVo formDataVo1 = changeMap.get(""); + if(null != formDataVo1) { + formDataVo1.getNewFieldDataMap().put("工商变更项目", type); + formDataVo1.getNewFieldDataMap().put("变更日期", changeDate); + formDataVo1.getNewFieldDataMap().put("工商变更前", record.getString("before_content")); + formDataVo1.getNewFieldDataMap().put("工商变更后", record.getString("after_content")); + formDataVo1.getNewFieldDataMap().put("历史信息标签", record.getString("tag")); + changeMap.remove(""); + } else { + Map fieldMap = new HashMap<>(); + fieldMap.put("工商变更项目", type); + fieldMap.put("变更日期", changeDate); + fieldMap.put("工商变更前", record.getString("before_content")); + fieldMap.put("工商变更后", record.getString("after_content")); + fieldMap.put("历史信息标签", record.getString("tag")); + FormDataBeanUtil.addNewRow("工商变更明细", formDataVo, fieldMap, masterBean); + } + } else { + changeRow.getNewFieldDataMap().put("工商变更前", record.getString("before_content")); + changeRow.getNewFieldDataMap().put("工商变更后", record.getString("after_content")); + changeRow.getNewFieldDataMap().put("历史信息标签", record.getString("tag")); + } + } + + FormDataBeanUtil.saveMaster(formDataVo, masterBean); + + formApi4Cap4.saveOrUpdateFormData(masterBean, formBean.getId(), true); + syncMsgs.add(sh + "同步成功"); + success.getAndIncrement(); + } catch (Exception e) { + log.error("同步失败:" + id + e.getMessage()); + syncMsgs.add("同步失败:" + id + e.getMessage()); + error.getAndIncrement(); + } + }); + } catch (Exception e){ + log.error("同步数据异常:", e); + } + return success.get() + "个成功 | 失败" + error.get() + "个:" + StringUtils.join(syncMsgs, " "); + } + + @Override + public String getName() { + return "定时同步启信宝数据"; + } + + + private JSONObject getCreditQueryInfo(String name) throws BusinessException { + String domain = mplusApi.getDomain(); + String ticket = mplusApi.getTicket(serviceCode); + String url = domain + "/svr/enterprise/info"; + Map jsonObject = new HashMap<>(); + jsonObject.put("ticket", ticket); + jsonObject.put("keyword", name); + jsonObject.put("type", "1"); + jsonObject.put("parameterType", "2"); + jsonObject.put("isEnterpriseOnly", 1); + jsonObject.put("isOpenMap", false); + Map res = HttpClientUtil.doPost(url, jsonObject); + Map data = (Map) res.get("data"); + String state = res.get("code").toString(); + if (!"1000".equals(state)) { + BusinessException e = new BusinessException(res.get("msg").toString()); + LOGGER.error(res.get("msg").toString(), e); + throw e; + } + Integer mplusType = MapUtils.getInteger(data, "mplusType"); + + Map queryInfo = new HashMap<>(); + Set handledNames = Sets.newHashSet(); + for (CreditQueryConstant.Category category : CreditQueryConstant.Category.values()) { + String egName = category.getKey(); + handledNames.add(egName); + if (data.containsKey(egName)) { + queryInfo.put(egName, data.get(egName)); + } + } + List municipalityList = Lists.newArrayList("北京", "天津", "上海", "重庆"); + Map info = new HashMap<>(); + data.entrySet().forEach(entry -> { + if (!handledNames.contains(entry.getKey())) { + if ("city".equals(entry.getKey()) && municipalityList.contains(data.get("province1"))) { + info.put(entry.getKey(), data.get("province1")); + } else { + info.put(entry.getKey(), entry.getValue()); + } + } + }); + queryInfo.put(getKeyName(mplusType), info); + if (!Objects.equals(mplusType, ENTERPRISE_INFO_EXACT_BUSINESS)) { + queryInfo.put("url", "||"); + }else{ + queryInfo.put("url", MapUtils.getString(data, "chart_url", "") + "|" + MapUtils.getString(data, "lawsuit_url", "") + "|" + MapUtils.getString(data, "risk_url", "")); + } + String s = JSONUtil.toJSONString(queryInfo); + + return JSONUtil.parseJSONString(s, JSONObject.class); + } + + /** + * 精确查询对应有三种类型 工商 事业单位 律所,根据type返回不同的key + * + * @param mplusType + * @return + */ + private String getKeyName(Integer mplusType) { + return Objects.equals(mplusType, ENTERPRISE_INFO_EXACT_BUSINESS) ? BUSINESS_INFO.getKey() : Objects.equals(mplusType, ENTERPRISE_INFO_EXACT_INSTITUTION) ? INSTITUTION.getKey() : LAW_FIRM_INFO.getKey(); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/data.json b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/data.json new file mode 100644 index 0000000..a565e76 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/quartz/data.json @@ -0,0 +1 @@ +{"changerecords":[{"change_date":"2023-09-26","tag":"非历史信息","before_content":"7726.7683万","after_content":"11515.8439万","change_item":"注册资本"},{"change_date":"2022-09-30","tag":"非历史信息","before_content":"7698.9583万","after_content":"7726.7683万","change_item":"注册资本"},{"change_date":"2022-09-30","tag":"非历史信息","before_content":"胡守云,李伟民,刘瑞华,马骏,申利锋,谭敏锋,王咏梅,向奇汉,徐景峰,徐石*,杨平勇,杨祉雄,尹好鹏,赵晓雯","after_content":"胡守云,李伟民,刘瑞华,马骏,申利锋,谭敏锋,陶维浩,王志成,向奇汉,徐景峰,徐石*,严洁联,杨平勇,杨祉雄,尹好鹏,赵晓雯","change_item":"董事"},{"change_date":"2022-09-30","tag":"非历史信息","before_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房;货物进出口、技术进出口。(市场主体依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事国家和本市产业政策禁止和限制类项目的经营活动。)","after_content":"一般项目:技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广;人工智能基础软件开发;网络与信息安全软件开发;软件开发;人工智能应用软件开发;软件销售;软件外包服务;人工智能理论与算法软件开发;计算机软硬件及辅助设备零售;信息系统集成服务;信息技术咨询服务;计算机系统服务;电子产品销售;机械设备销售;非居住房地产租赁;货物进出口;技术进出口。(除依法须经批准的项目外,凭营业执照依法自主开展经营活动)许可项目:第一类增值电信业务;第二类增值电信业务。(依法须经批准的项目,经相关部门批准后方可开展经营活动,具体经营项目以相关部门批准文件或许可证件为准)(不得从事国家和本市产业政策禁止和限制类项目的经营活动。)","change_item":"经营范围"},{"change_date":"2021-07-26","tag":"非历史信息","before_content":"董衍善,胡守云,李伟民,刘瑞华,马骏,申利锋,谭敏锋,王咏梅,向奇汉,徐石*,杨平勇,杨祉雄,尹好鹏,赵晓雯","after_content":"胡守云,李伟民,刘瑞华,马骏,申利锋,谭敏锋,王咏梅,向奇汉,徐景峰,徐石*,杨平勇,杨祉雄,尹好鹏,赵晓雯","change_item":"董事"},{"change_date":"2021-05-26","tag":"非历史信息","before_content":"董衍善,胡守云,李伟民,李小龙,刘瑞华,马骏,申利锋,谭敏锋,王咏梅,向奇汉,徐石*,杨祉雄,尹好鹏,赵晓雯","after_content":"董衍善,胡守云,李伟民,刘瑞华,马骏,申利锋,谭敏锋,王咏梅,向奇汉,徐石*,杨平勇,杨祉雄,尹好鹏,赵晓雯","change_item":"董事"},{"change_date":"2019-12-25","tag":"非历史信息","before_content":"-","after_content":"董衍善,胡守云,李伟民,李小龙,刘瑞华,马骏,申利锋,谭敏锋,王咏梅,向奇汉,徐石*,杨祉雄,尹好鹏,赵晓雯","change_item":"董事"},{"change_date":"2019-12-25","tag":"非历史信息","before_content":"股份有限公司(非上市、自然人投资或控股)","after_content":"股份有限公司(上市、自然人投资或控股)","change_item":"企业类型"},{"change_date":"2019-12-25","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)无","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 胡守云 董事 3 向奇汉 董事 4 杨祉雄 董事 5 李小龙 董事 6 马骏 董事 7 王咏梅 独立董事 8 尹好鹏 独立董事 9 董衍善 独立董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 赵晓雯 监事 13 申利锋 监事 14 李伟民 监事 15 谭敏锋 监事","change_item":"董事"},{"change_date":"2019-12-25","tag":"非历史信息","before_content":"5773.9583万","after_content":"7698.9583万","change_item":"注册资本"},{"change_date":"2019-12-25","tag":"历史信息","before_content":"-","after_content":"徐石*,王咏梅,胡守云,马骏,谭敏锋,李小龙,杨祉雄,董衍善,尹好鹏,向奇汉,李伟民,申利锋,赵晓雯,刘瑞华","change_item":"董事"},{"change_date":"2019-12-25","tag":"历史信息","before_content":"5773.9583万元","after_content":"7698.9583万元","change_item":"注册资本"},{"change_date":"2019-04-29","tag":"非历史信息","before_content":"董衍善,胡守云,黄涌,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,由立明,张沿沿","after_content":"-","change_item":"董事"},{"change_date":"2019-04-29","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 董衍善 董事 3 王咏梅 董事 4 马骏 董事 5 胡守云 董事 6 杨祉雄 董事 7 黄涌 董事 8 由立明 董事 9 李小龙 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 谭敏锋 监事 13 张沿沿 监事 14 曲璐 监事 15 任明 监事","after_content":"(注:标有*标志的为法定代表人)无","change_item":"董事"},{"change_date":"2019-04-29","tag":"历史信息","before_content":"徐石*,曲璐,董衍善,谭敏锋,刘瑞华,王咏梅,任明,马骏,胡守云,张沿沿,杨祉雄,黄涌,李小龙,由立明","after_content":"-","change_item":"董事"},{"change_date":"2019-04-04","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 黄涌 董事 3 董衍善 董事 4 何劲松 董事 5 王咏梅 董事 6 马骏 董事 7 李小龙 董事 8 杨祉雄 董事 9 胡守云 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 张沿沿 监事 13 谭敏锋 监事 14 曲璐 监事 15 任明 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 董衍善 董事 3 王咏梅 董事 4 马骏 董事 5 胡守云 董事 6 杨祉雄 董事 7 黄涌 董事 8 由立明 董事 9 李小龙 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 谭敏锋 监事 13 张沿沿 监事 14 曲璐 监事 15 任明 监事","change_item":"董事"},{"change_date":"2019-04-04","tag":"历史信息","before_content":"1 徐石 董事长;2 黄涌 董事;3 董衍善 董事;4 何劲松 董事;5 王咏梅 董事;6 马骏 董事;7 李小龙 董事;8 杨祉雄 董事;9 胡守云 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 张沿沿 监事;13 谭敏锋 监事;14 曲璐 监事;15 任明 监事","after_content":"1 徐石 董事长;2 董衍善 董事;3 王咏梅 董事;4 马骏 董事;5 胡守云 董事;6 杨祉雄 董事;7 黄涌 董事;8 由立明 董事;9 李小龙 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 谭敏锋 监事;13 张沿沿 监事;14 曲璐 监事;15 任明 监事","change_item":"董事"},{"change_date":"2019-04-04","tag":"历史信息","before_content":"董衍善,何劲松,刘瑞华,徐石*,王咏梅,任明,马骏,谭敏锋,曲璐,李小龙,胡守云,张沿沿,杨祉雄,黄涌","after_content":"徐石*,曲璐,董衍善,谭敏锋,刘瑞华,王咏梅,任明,马骏,胡守云,张沿沿,杨祉雄,黄涌,李小龙,由立明","change_item":"董事"},{"change_date":"2019-04-04","tag":"非历史信息","before_content":"董衍善,何劲松,胡守云,黄涌,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,张沿沿","after_content":"董衍善,胡守云,黄涌,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,由立明,张沿沿","change_item":"董事"},{"change_date":"2018-03-29","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 何劲松 董事 3 黄涌 董事 4 蔡剑 董事 5 马骏 董事 6 王咏梅 董事 7 杨祉雄 董事 8 胡守云 董事 9 李小龙 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 谭敏锋 监事 13 张沿沿 监事 14 任明 监事 15 曲璐 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 黄涌 董事 3 董衍善 董事 4 何劲松 董事 5 杨祉雄 董事 6 胡守云 董事 7 李小龙 董事 8 马骏 董事 9 王咏梅 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 谭敏锋 监事 13 张沿沿 监事 14 任明 监事 15 曲璐 监事","change_item":"董事"},{"change_date":"2018-03-29","tag":"非历史信息","before_content":"蔡剑,何劲松,胡守云,黄涌,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,张沿沿","after_content":"董衍善,何劲松,胡守云,黄涌,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,张沿沿","change_item":"董事"},{"change_date":"2018-03-29","tag":"历史信息","before_content":"1 徐石 董事长;2 蔡剑 董事;3 何劲松 董事;4 李小龙 董事;5 胡守云 董事;6 杨祉雄 董事;7 黄涌 董事;8 马骏 董事;9 王咏梅 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 任明 监事;13 曲璐 监事;14 张沿沿 监事;15 谭敏锋 监事","after_content":"1 徐石 董事长;2 黄涌 董事;3 董衍善 董事;4 何劲松 董事;5 王咏梅 董事;6 马骏 董事;7 李小龙 董事;8 杨祉雄 董事;9 胡守云 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 张沿沿 监事;13 谭敏锋 监事;14 曲璐 监事;15 任明 监事","change_item":"董事"},{"change_date":"2018-03-29","tag":"历史信息","before_content":"何劲松,谭敏锋,曲璐,李小龙,胡守云,张沿沿,杨祉雄,黄涌,王咏梅,任明,马骏,徐石*,蔡剑,刘瑞华","after_content":"董衍善,何劲松,刘瑞华,徐石*,王咏梅,任明,马骏,谭敏锋,曲璐,李小龙,胡守云,张沿沿,杨祉雄,黄涌","change_item":"董事"},{"change_date":"2018-03-29","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蔡剑 董事 3 何劲松 董事 4 李小龙 董事 5 胡守云 董事 6 杨祉雄 董事 7 黄涌 董事 8 马骏 董事 9 王咏梅 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 任明 监事 13 曲璐 监事 14 张沿沿 监事 15 谭敏锋 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 黄涌 董事 3 董衍善 董事 4 何劲松 董事 5 王咏梅 董事 6 马骏 董事 7 李小龙 董事 8 杨祉雄 董事 9 胡守云 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 张沿沿 监事 13 谭敏锋 监事 14 曲璐 监事 15 任明 监事","change_item":"董事"},{"change_date":"2018-03-29","tag":"非历史信息","before_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。(企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。)","after_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房;货物进出口、技术进出口。(企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。)","change_item":"经营范围"},{"change_date":"2018-03-29","tag":"历史信息","before_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。","after_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房;货物进出口、技术进出口。企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。","change_item":"经营范围"},{"change_date":"2017-07-19","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蒋蜀革 董事 3 马骏 董事 4 胡守云 董事 5 李小龙 董事 6 杨祉雄 董事 7 蔡剑 董事 8 王咏梅 董事 9 黄涌 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 张沿沿 监事 13 曲璐 监事 14 谭敏锋 监事 15 任明 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 何劲松 董事 3 黄涌 董事 4 蔡剑 董事 5 马骏 董事 6 王咏梅 董事 7 杨祉雄 董事 8 胡守云 董事 9 李小龙 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 谭敏锋 监事 13 张沿沿 监事 14 任明 监事 15 曲璐 监事","change_item":"董事"},{"change_date":"2017-07-19","tag":"历史信息","before_content":"王咏梅,任明,马骏,徐石*,刘瑞华,蔡剑,谭敏锋,曲璐,李小龙,胡守云,张沿沿,蒋蜀革,杨祉雄,黄涌","after_content":"何劲松,谭敏锋,曲璐,李小龙,胡守云,张沿沿,杨祉雄,黄涌,王咏梅,任明,马骏,徐石*,蔡剑,刘瑞华","change_item":"董事"},{"change_date":"2017-07-19","tag":"历史信息","before_content":"1 徐石 董事长;2 黄涌 董事;3 王咏梅 董事;4 马骏 董事;5 蔡剑 董事;6 李小龙 董事;7 胡守云 董事;8 杨祉雄 董事;9 蒋蜀革 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 张沿沿 监事;13 谭敏锋 监事;14 曲璐 监事;15 任明 监事","after_content":"1 徐石 董事长;2 蔡剑 董事;3 何劲松 董事;4 李小龙 董事;5 胡守云 董事;6 杨祉雄 董事;7 黄涌 董事;8 马骏 董事;9 王咏梅 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 任明 监事;13 曲璐 监事;14 张沿沿 监事;15 谭敏锋 监事","change_item":"董事"},{"change_date":"2017-07-19","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 黄涌 董事 3 王咏梅 董事 4 马骏 董事 5 蔡剑 董事 6 李小龙 董事 7 胡守云 董事 8 杨祉雄 董事 9 蒋蜀革 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 张沿沿 监事 13 谭敏锋 监事 14 曲璐 监事 15 任明 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蔡剑 董事 3 何劲松 董事 4 李小龙 董事 5 胡守云 董事 6 杨祉雄 董事 7 黄涌 董事 8 马骏 董事 9 王咏梅 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 任明 监事 13 曲璐 监事 14 张沿沿 监事 15 谭敏锋 监事","change_item":"董事"},{"change_date":"2017-07-19","tag":"非历史信息","before_content":"蔡剑,胡守云,黄涌,蒋蜀革,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,张沿沿","after_content":"蔡剑,何劲松,胡守云,黄涌,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,张沿沿","change_item":"董事"},{"change_date":"2017-02-23","tag":"历史信息","before_content":"5000万元","after_content":"5773.9583万元","change_item":"注册资本"},{"change_date":"2017-02-23","tag":"非历史信息","before_content":"5000万","after_content":"5773.9583万","change_item":"注册资本"},{"change_date":"2017-02-23","tag":"非历史信息","before_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房;第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。(企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。)","after_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。(企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。)","change_item":"经营范围"},{"change_date":"2017-02-23","tag":"历史信息","before_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。","after_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训(不得面向全国招生);基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。","change_item":"经营范围"},{"change_date":"2016-09-26","tag":"历史信息","before_content":"1 徐石 1781 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 593 企业法人;3 二六三网络通信股份有限公司 375 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 358 企业法人;5 用友网络科技股份有限公司 249 法人股东;6 胡守云 222.5 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 211.5 法人股东;8 陶维浩 160.5 自然人股东;9 林丹 160.5 自然人股东;10 张屹 125.5 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 109 企业法人;12 唐海蓉 100 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 95.5 企业法人;14 成都明泰祥云企业管理中心(有限合伙) 84 企业法人;15 深圳昀润创新投资合伙企业(有限合伙) 75 企业法人;16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 50 企业法人;17 文杰 45 自然人股东;18 黄涌 45 自然人股东;19 黄子萱 45 自然人股东;20 杨祉雄 45 自然人股东;21 李兴旺 25 自然人股东;22 黄子茜 22.5 自然人股东;23 刘古泉 22.5 自然人股东","after_content":"1 徐石 1781 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 593 企业法人;3 二六三网络通信股份有限公司 375 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 358 企业法人;5 用友网络科技股份有限公司 249 法人股东;6 胡守云 222.5 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 211.5 法人股东;8 林丹 160.5 自然人股东;9 陶维浩 160.5 自然人股东;10 张屹 125.5 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 109 企业法人;12 唐海蓉 100 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 95.5 企业法人;14 成都明泰祥云企业管理中心(有限合伙) 84 企业法人;15 深圳昀润创新投资合伙企业(有限合伙) 75 企业法人;16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 50 企业法人;17 文杰 45 自然人股东;18 黄涌 45 自然人股东;19 杨祉雄 45 自然人股东;20 黄子茜 45 自然人股东;21 李兴旺 25 自然人股东;22 黄子萱 22.5 自然人股东;23 刘古泉 22.5 自然人股东","change_item":"投资人"},{"change_date":"2016-09-26","tag":"非历史信息","before_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),企业法人,成都明泰祥云企业管理中心(有限合伙),企业法人,成都仁泰祥云企业管理中心(有限合伙),企业法人,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),企业法人,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,李兴旺,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),企业法人,深圳昀润创新投资合伙企业(有限合伙),企业法人,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲壹期股权投资合伙企业(有限合伙),企业法人,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),企业法人,成都明泰祥云企业管理中心(有限合伙),企业法人,成都仁泰祥云企业管理中心(有限合伙),企业法人,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),企业法人,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,李兴旺,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),企业法人,深圳昀润创新投资合伙企业(有限合伙),企业法人,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲壹期股权投资合伙企业(有限合伙),企业法人,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2016-09-26","tag":"历史信息","before_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 企业法人 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 企业法人 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 陶维浩 自然人股东 9 林丹 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 企业法人 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 企业法人 14 成都明泰祥云企业管理中心(有限合伙) 企业法人 15 深圳昀润创新投资合伙企业(有限合伙) 企业法人 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 企业法人 17 文杰 自然人股东 18 黄涌 自然人股东 19 黄子萱 自然人股东 20 杨祉雄 自然人股东 21 李兴旺 自然人股东 22 黄子茜 自然人股东 23 刘古泉 自然人股东","after_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 企业法人 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 企业法人 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 林丹 自然人股东 9 陶维浩 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 企业法人 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 企业法人 14 成都明泰祥云企业管理中心(有限合伙) 企业法人 15 深圳昀润创新投资合伙企业(有限合伙) 企业法人 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 企业法人 17 文杰 自然人股东 18 黄涌 自然人股东 19 杨祉雄 自然人股东 20 黄子茜 自然人股东 21 李兴旺 自然人股东 22 黄子萱 自然人股东 23 刘古泉 自然人股东","change_item":"投资人"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"1 徐石 董事长;2 马骏 董事;3 杨祉雄 董事;4 李小龙 董事;5 黄涌 董事;6 徐石 经理;7 贾文新 监事","after_content":"1 徐石 董事长;2 蔡剑 董事;3 李小龙 董事;4 胡守云 董事;5 杨祉雄 董事;6 黄涌 董事;7 王咏梅 董事;8 马骏 董事;9 蒋蜀革 董事;10 徐石 经理;11 刘瑞华 监事会主席;12 曲璐 监事;13 张沿沿 监事;14 谭敏锋 监事;15 任明 监事","change_item":"董事"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"1 徐石 395.72 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 用友网络科技股份有限公司 55.33 法人股东;6 胡守云 49.4 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;8 陶维浩 35.7 自然人股东;9 林丹 35.7 自然人股东;10 张屹 27.92 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 唐海蓉 22.22 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东;16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 11.11 法人股东;17 杨祉雄 10 自然人股东;18 黄涌 10 自然人股东;19 文杰 10 自然人股东;20 黄子茜 10 自然人股东;21 李兴旺 5.56 自然人股东;22 刘古泉 5 自然人股东;23 黄子萱 5 自然人股东","after_content":"1 徐石 1781 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 593 企业法人;3 二六三网络通信股份有限公司 375 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 358 企业法人;5 用友网络科技股份有限公司 249 法人股东;6 胡守云 222.5 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 211.5 法人股东;8 陶维浩 160.5 自然人股东;9 林丹 160.5 自然人股东;10 张屹 125.5 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 109 企业法人;12 唐海蓉 100 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 95.5 企业法人;14 成都明泰祥云企业管理中心(有限合伙) 84 企业法人;15 深圳昀润创新投资合伙企业(有限合伙) 75 企业法人;16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 50 企业法人;17 文杰 45 自然人股东;18 黄涌 45 自然人股东;19 黄子萱 45 自然人股东;20 杨祉雄 45 自然人股东;21 李兴旺 25 自然人股东;22 黄子茜 22.5 自然人股东;23 刘古泉 22.5 自然人股东","change_item":"投资人"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"1 徐石 395.72 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 用友网络科技股份有限公司 55.33 法人股东 6 胡守云 49.4 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 8 陶维浩 35.7 自然人股东 9 林丹 35.7 自然人股东 10 张屹 27.92 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 唐海蓉 22.22 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 11.11 法人股东 17 杨祉雄 10 自然人股东 18 黄涌 10 自然人股东 19 文杰 10 自然人股东 20 黄子茜 10 自然人股东 21 李兴旺 5.56 自然人股东 22 刘古泉 5 自然人股东 23 黄子萱 5 自然人股东","after_content":"1 徐石 1781 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 593 企业法人 3 二六三网络通信股份有限公司 375 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 358 企业法人 5 用友网络科技股份有限公司 249 法人股东 6 胡守云 222.5 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 211.5 法人股东 8 陶维浩 160.5 自然人股东 9 林丹 160.5 自然人股东 10 张屹 125.5 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 109 企业法人 12 唐海蓉 100 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 95.5 企业法人 14 成都明泰祥云企业管理中心(有限合伙) 84 企业法人 15 深圳昀润创新投资合伙企业(有限合伙) 75 企业法人 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 50 企业法人 17 文杰 45 自然人股东 18 黄涌 45 自然人股东 19 黄子萱 45 自然人股东 20 杨祉雄 45 自然人股东 21 李兴旺 25 自然人股东 22 黄子茜 22.5 自然人股东 23 刘古泉 22.5 自然人股东","change_item":"投资人"},{"change_date":"2016-09-13","tag":"非历史信息","before_content":"有限责任公司(自然人投资或控股)","after_content":"股份有限公司(非上市、自然人投资或控股)","change_item":"企业类型"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"1111.1111万元","after_content":"5000万元","change_item":"注册资本"},{"change_date":"2016-09-13","tag":"非历史信息","before_content":"北京致远协创软件有限公司","after_content":"北京致远互联软件股份有限公司","change_item":"企业名称"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 马骏 董事 3 杨祉雄 董事 4 李小龙 董事 5 黄涌 董事 6 徐石* 经理 7 贾文新 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蔡剑 董事 3 李小龙 董事 4 胡守云 董事 5 蒋蜀革 董事 6 杨祉雄 董事 7 黄涌 董事 8 马骏 董事 9 王咏梅 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 曲璐 监事 13 任明 监事 14 谭敏锋 监事 15 张沿沿 监事","change_item":"董事"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 马骏 董事 3 杨祉雄 董事 4 李小龙 董事 5 黄涌 董事 6 徐石* 经理 7 贾文新 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蔡剑 董事 3 李小龙 董事 4 胡守云 董事 5 杨祉雄 董事 6 黄涌 董事 7 王咏梅 董事 8 马骏 董事 9 蒋蜀革 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 曲璐 监事 13 张沿沿 监事 14 谭敏锋 监事 15 任明 监事","change_item":"董事"},{"change_date":"2016-09-13","tag":"非历史信息","before_content":"1111.1111万","after_content":"5000万","change_item":"注册资本"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 陶维浩 自然人股东 9 林丹 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 法人股东 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 法人股东 17 杨祉雄 自然人股东 18 黄涌 自然人股东 19 文杰 自然人股东 20 黄子茜 自然人股东 21 李兴旺 自然人股东 22 刘古泉 自然人股东 23 黄子萱 自然人股东","after_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 企业法人 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 企业法人 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 陶维浩 自然人股东 9 林丹 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 企业法人 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 企业法人 14 成都明泰祥云企业管理中心(有限合伙) 企业法人 15 深圳昀润创新投资合伙企业(有限合伙) 企业法人 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 企业法人 17 文杰 自然人股东 18 黄涌 自然人股东 19 黄子萱 自然人股东 20 杨祉雄 自然人股东 21 李兴旺 自然人股东 22 黄子茜 自然人股东 23 刘古泉 自然人股东","change_item":"投资人"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"50","after_content":"-","change_item":"经营期限"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 李小龙 董事 3 杨祉雄 董事 4 黄涌 董事 5 马骏 董事 6 徐石* 经理 7 贾文新 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 李小龙 董事 3 胡守云 董事 4 蔡剑 董事 5 马骏 董事 6 王咏梅 董事 7 黄涌 董事 8 杨祉雄 董事 9 蒋蜀革 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 曲璐 监事 13 谭敏锋 监事 14 任明 监事 15 张沿沿 监事","change_item":"董事"},{"change_date":"2016-09-13","tag":"非历史信息","before_content":"黄涌,贾文新,李小龙,马骏,徐石*,杨祉雄","after_content":"蔡剑,胡守云,黄涌,蒋蜀革,李小龙,刘瑞华,马骏,曲璐,任明,谭敏锋,王咏梅,徐石*,杨祉雄,张沿沿","change_item":"董事"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"黄涌,杨祉雄,徐石*,马骏,贾文新,李小龙","after_content":"李小龙,胡守云,张沿沿,蒋蜀革,杨祉雄,黄涌,刘瑞华,王咏梅,任明,马骏,徐石*,蔡剑,谭敏锋,曲璐","change_item":"董事"},{"change_date":"2016-09-13","tag":"非历史信息","before_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,李兴旺,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,深圳昀润创新投资合伙企业(有限合伙),法人股东,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲壹期股权投资合伙企业(有限合伙),法人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),企业法人,成都明泰祥云企业管理中心(有限合伙),企业法人,成都仁泰祥云企业管理中心(有限合伙),企业法人,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),企业法人,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,李兴旺,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),企业法人,深圳昀润创新投资合伙企业(有限合伙),企业法人,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲壹期股权投资合伙企业(有限合伙),企业法人,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 杨祉雄 董事 3 马骏 董事 4 李小龙 董事 5 黄涌 董事 6 徐石* 经理 7 贾文新 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蔡剑 董事 3 李小龙 董事 4 胡守云 董事 5 杨祉雄 董事 6 黄涌 董事 7 王咏梅 董事 8 马骏 董事 9 蒋蜀革 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 曲璐 监事 13 张沿沿 监事 14 谭敏锋 监事 15 任明 监事","change_item":"董事"},{"change_date":"2016-09-13","tag":"非历史信息","before_content":"-","after_content":"-","change_item":"经营期限"},{"change_date":"2016-09-13","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 杨祉雄 董事 3 马骏 董事 4 李小龙 董事 5 黄涌 董事 6 徐石* 经理 7 贾文新 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 蔡剑 董事 3 李小龙 董事 4 胡守云 董事 5 蒋蜀革 董事 6 杨祉雄 董事 7 黄涌 董事 8 马骏 董事 9 王咏梅 董事 10 徐石* 经理 11 刘瑞华 监事会主席 12 曲璐 监事 13 任明 监事 14 谭敏锋 监事 15 张沿沿 监事","change_item":"董事"},{"change_date":"2016-08-11","tag":"历史信息","before_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。","after_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。","change_item":"经营范围"},{"change_date":"2016-08-11","tag":"非历史信息","before_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,深圳昀润创新投资合伙企业(有限合伙),法人股东,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲一期股权投资合伙企业(有限合伙),法人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,李兴旺,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,深圳昀润创新投资合伙企业(有限合伙),法人股东,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲壹期股权投资合伙企业(有限合伙),法人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2016-08-11","tag":"历史信息","before_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 林丹 自然人股东 9 陶维浩 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 法人股东 16 新疆五五绿洲一期股权投资合伙企业(有限合伙) 法人股东 17 杨祉雄 自然人股东 18 黄涌 自然人股东 19 文杰 自然人股东 20 黄子茜 自然人股东 21 刘古泉 自然人股东 22 黄子萱 自然人股东","after_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 陶维浩 自然人股东 9 林丹 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 法人股东 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 法人股东 17 杨祉雄 自然人股东 18 黄涌 自然人股东 19 文杰 自然人股东 20 黄子茜 自然人股东 21 李兴旺 自然人股东 22 刘古泉 自然人股东 23 黄子萱 自然人股东","change_item":"投资人"},{"change_date":"2016-08-11","tag":"历史信息","before_content":"1 徐石 401.28 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 用友网络科技股份有限公司 55.33 法人股东 6 胡守云 49.4 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 8 林丹 35.7 自然人股东 9 陶维浩 35.7 自然人股东 10 张屹 27.92 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 唐海蓉 22.22 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东 16 新疆五五绿洲一期股权投资合伙企业(有限合伙) 11.11 法人股东 17 杨祉雄 10 自然人股东 18 黄涌 10 自然人股东 19 文杰 10 自然人股东 20 黄子茜 10 自然人股东 21 刘古泉 5 自然人股东 22 黄子萱 5 自然人股东","after_content":"1 徐石 395.72 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 用友网络科技股份有限公司 55.33 法人股东 6 胡守云 49.4 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 8 陶维浩 35.7 自然人股东 9 林丹 35.7 自然人股东 10 张屹 27.92 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 唐海蓉 22.22 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东 16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 11.11 法人股东 17 杨祉雄 10 自然人股东 18 黄涌 10 自然人股东 19 文杰 10 自然人股东 20 黄子茜 10 自然人股东 21 李兴旺 5.56 自然人股东 22 刘古泉 5 自然人股东 23 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2016-08-11","tag":"历史信息","before_content":"1 徐石 401.28 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 用友网络科技股份有限公司 55.33 法人股东;6 胡守云 49.4 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;8 林丹 35.7 自然人股东;9 陶维浩 35.7 自然人股东;10 张屹 27.92 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 唐海蓉 22.22 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东;16 新疆五五绿洲一期股权投资合伙企业(有限合伙) 11.11 法人股东;17 杨祉雄 10 自然人股东;18 黄涌 10 自然人股东;19 文杰 10 自然人股东;20 黄子茜 10 自然人股东;21 刘古泉 5 自然人股东;22 黄子萱 5 自然人股东","after_content":"1 徐石 395.72 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 用友网络科技股份有限公司 55.33 法人股东;6 胡守云 49.4 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;8 陶维浩 35.7 自然人股东;9 林丹 35.7 自然人股东;10 张屹 27.92 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 唐海蓉 22.22 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东;16 新疆五五绿洲壹期股权投资合伙企业(有限合伙) 11.11 法人股东;17 杨祉雄 10 自然人股东;18 黄涌 10 自然人股东;19 文杰 10 自然人股东;20 黄子茜 10 自然人股东;21 李兴旺 5.56 自然人股东;22 刘古泉 5 自然人股东;23 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2016-08-11","tag":"非历史信息","before_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日);技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。)","after_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日);技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备;出租商业用房。(企业依法自主选择经营项目,开展经营活动;依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事本市产业政策禁止和限制类项目的经营活动。)","change_item":"经营范围"},{"change_date":"2016-04-29","tag":"非历史信息","before_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,深圳昀润创新投资合伙企业(有限合伙),法人股东,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,新疆五五绿洲一期股权投资合伙企业(有限合伙),法人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2016-04-29","tag":"历史信息","before_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 张屹 自然人股东 6 用友网络科技股份有限公司 法人股东 7 胡守云 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 法人股东 9 陶维浩 自然人股东 10 林丹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 法人股东 15 黄子茜 自然人股东 16 杨祉雄 自然人股东 17 黄涌 自然人股东 18 文杰 自然人股东 19 刘古泉 自然人股东 20 黄子萱 自然人股东","after_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 用友网络科技股份有限公司 法人股东 6 胡守云 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 法人股东 8 林丹 自然人股东 9 陶维浩 自然人股东 10 张屹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 法人股东 16 新疆五五绿洲一期股权投资合伙企业(有限合伙) 法人股东 17 杨祉雄 自然人股东 18 黄涌 自然人股东 19 文杰 自然人股东 20 黄子茜 自然人股东 21 刘古泉 自然人股东 22 黄子萱 自然人股东","change_item":"投资人"},{"change_date":"2016-04-29","tag":"历史信息","before_content":"1 徐石 401.28 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 张屹 55.7 自然人股东;6 用友网络科技股份有限公司 55.33 法人股东;7 胡守云 49.4 自然人股东;8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;9 陶维浩 35.7 自然人股东;10 林丹 35.7 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 唐海蓉 22.22 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;15 黄子茜 10 自然人股东;16 杨祉雄 10 自然人股东;17 黄涌 10 自然人股东;18 文杰 10 自然人股东;19 刘古泉 5 自然人股东;20 黄子萱 5 自然人股东","after_content":"1 徐石 401.28 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 用友网络科技股份有限公司 55.33 法人股东;6 胡守云 49.4 自然人股东;7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;8 林丹 35.7 自然人股东;9 陶维浩 35.7 自然人股东;10 张屹 27.92 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 唐海蓉 22.22 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东;16 新疆五五绿洲一期股权投资合伙企业(有限合伙) 11.11 法人股东;17 杨祉雄 10 自然人股东;18 黄涌 10 自然人股东;19 文杰 10 自然人股东;20 黄子茜 10 自然人股东;21 刘古泉 5 自然人股东;22 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2016-04-29","tag":"历史信息","before_content":"1 徐石 401.28 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 张屹 55.7 自然人股东 6 用友网络科技股份有限公司 55.33 法人股东 7 胡守云 49.4 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 9 陶维浩 35.7 自然人股东 10 林丹 35.7 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 唐海蓉 22.22 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 15 黄子茜 10 自然人股东 16 杨祉雄 10 自然人股东 17 黄涌 10 自然人股东 18 文杰 10 自然人股东 19 刘古泉 5 自然人股东 20 黄子萱 5 自然人股东","after_content":"1 徐石 401.28 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 用友网络科技股份有限公司 55.33 法人股东 6 胡守云 49.4 自然人股东 7 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 8 林丹 35.7 自然人股东 9 陶维浩 35.7 自然人股东 10 张屹 27.92 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 唐海蓉 22.22 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 15 深圳昀润创新投资合伙企业(有限合伙) 16.67 法人股东 16 新疆五五绿洲一期股权投资合伙企业(有限合伙) 11.11 法人股东 17 杨祉雄 10 自然人股东 18 黄涌 10 自然人股东 19 文杰 10 自然人股东 20 黄子茜 10 自然人股东 21 刘古泉 5 自然人股东 22 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2016-03-18","tag":"历史信息","before_content":"1 徐石 423.5 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 张屹 55.7 自然人股东;6 用友网络科技股份有限公司 55.33 法人股东;7 胡守云 49.4 自然人股东;8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;9 林丹 35.7 自然人股东;10 陶维浩 35.7 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;13 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;14 杨祉雄 10 自然人股东;15 黄涌 10 自然人股东;16 黄子茜 10 自然人股东;17 文杰 10 自然人股东;18 刘古泉 5 自然人股东;19 黄子萱 5 自然人股东","after_content":"1 徐石 401.28 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 张屹 55.7 自然人股东;6 用友网络科技股份有限公司 55.33 法人股东;7 胡守云 49.4 自然人股东;8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;9 陶维浩 35.7 自然人股东;10 林丹 35.7 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 唐海蓉 22.22 自然人股东;13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;15 黄子茜 10 自然人股东;16 杨祉雄 10 自然人股东;17 黄涌 10 自然人股东;18 文杰 10 自然人股东;19 刘古泉 5 自然人股东;20 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2016-03-18","tag":"历史信息","before_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 张屹 自然人股东 6 用友网络科技股份有限公司 法人股东 7 胡守云 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 法人股东 9 林丹 自然人股东 10 陶维浩 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 成都仁泰祥云企业管理中心(有限合伙) 法人股东 13 成都明泰祥云企业管理中心(有限合伙) 法人股东 14 杨祉雄 自然人股东 15 黄涌 自然人股东 16 黄子茜 自然人股东 17 文杰 自然人股东 18 刘古泉 自然人股东 19 黄子萱 自然人股东","after_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 张屹 自然人股东 6 用友网络科技股份有限公司 法人股东 7 胡守云 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 法人股东 9 陶维浩 自然人股东 10 林丹 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 唐海蓉 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 法人股东 15 黄子茜 自然人股东 16 杨祉雄 自然人股东 17 黄涌 自然人股东 18 文杰 自然人股东 19 刘古泉 自然人股东 20 黄子萱 自然人股东","change_item":"投资人"},{"change_date":"2016-03-18","tag":"历史信息","before_content":"1 徐石 423.5 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 张屹 55.7 自然人股东 6 用友网络科技股份有限公司 55.33 法人股东 7 胡守云 49.4 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 9 林丹 35.7 自然人股东 10 陶维浩 35.7 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 13 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 14 杨祉雄 10 自然人股东 15 黄涌 10 自然人股东 16 黄子茜 10 自然人股东 17 文杰 10 自然人股东 18 刘古泉 5 自然人股东 19 黄子萱 5 自然人股东","after_content":"1 徐石 401.28 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 张屹 55.7 自然人股东 6 用友网络科技股份有限公司 55.33 法人股东 7 胡守云 49.4 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 9 陶维浩 35.7 自然人股东 10 林丹 35.7 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 唐海蓉 22.22 自然人股东 13 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 14 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 15 黄子茜 10 自然人股东 16 杨祉雄 10 自然人股东 17 黄涌 10 自然人股东 18 文杰 10 自然人股东 19 刘古泉 5 自然人股东 20 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2016-03-18","tag":"非历史信息","before_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,唐海蓉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"1 徐石 自然人股东 2 用友网络科技股份有限公司 法人股东 3 张屹 自然人股东 4 胡守云 自然人股东 5 成都恒泰祥云企业管理中心(有限合伙) 法人股东 6 林丹 自然人股东 7 陶维浩 自然人股东 8 成都开泰祥云企业管理中心(有限合伙) 法人股东 9 成都仁泰祥云企业管理中心(有限合伙) 法人股东 10 成都明泰祥云企业管理中心(有限合伙) 法人股东 11 黄涌 自然人股东 12 杨祉雄 自然人股东 13 文杰 自然人股东 14 黄子茜 自然人股东 15 刘古泉 自然人股东 16 黄子萱 自然人股东","after_content":"1 徐石 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 法人股东 3 二六三网络通信股份有限公司 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 法人股东 5 张屹 自然人股东 6 用友网络科技股份有限公司 法人股东 7 胡守云 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 法人股东 9 林丹 自然人股东 10 陶维浩 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 法人股东 12 成都仁泰祥云企业管理中心(有限合伙) 法人股东 13 成都明泰祥云企业管理中心(有限合伙) 法人股东 14 杨祉雄 自然人股东 15 黄涌 自然人股东 16 黄子茜 自然人股东 17 文杰 自然人股东 18 刘古泉 自然人股东 19 黄子萱 自然人股东","change_item":"投资人"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"1 徐石 董事长;2 贾文新 董事;3 吴政平 董事;4 杨祉雄 董事;5 黄涌 董事;6 徐石 经理;7 林丹 监事","after_content":"1 徐石 董事长;2 马骏 董事;3 杨祉雄 董事;4 李小龙 董事;5 黄涌 董事;6 徐石 经理;7 贾文新 监事","change_item":"董事"},{"change_date":"2015-12-25","tag":"非历史信息","before_content":"黄涌,贾文新,林丹,吴政平,徐石*,杨祉雄","after_content":"黄涌,贾文新,李小龙,马骏,徐石*,杨祉雄","change_item":"董事"},{"change_date":"2015-12-25","tag":"非历史信息","before_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,二六三网络通信股份有限公司,企业法人,共青城随锐融通创新投资中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,深圳市信义一德信智一号创新投资管理企业(有限合伙),法人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"1 徐石 423.5 自然人股东 2 用友网络科技股份有限公司 350 法人股东 3 张屹 55.7 自然人股东 4 胡守云 49.4 自然人股东 5 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 6 林丹 35.7 自然人股东 7 陶维浩 35.7 自然人股东 8 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 9 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 10 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 11 黄涌 10 自然人股东 12 杨祉雄 10 自然人股东 13 文杰 10 自然人股东 14 黄子茜 10 自然人股东 15 刘古泉 5 自然人股东 16 黄子萱 5 自然人股东","after_content":"1 徐石 423.5 自然人股东 2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东 3 二六三网络通信股份有限公司 83.33 企业法人 4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东 5 张屹 55.7 自然人股东 6 用友网络科技股份有限公司 55.33 法人股东 7 胡守云 49.4 自然人股东 8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 9 林丹 35.7 自然人股东 10 陶维浩 35.7 自然人股东 11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 12 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 13 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 14 杨祉雄 10 自然人股东 15 黄涌 10 自然人股东 16 黄子茜 10 自然人股东 17 文杰 10 自然人股东 18 刘古泉 5 自然人股东 19 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 贾文新 董事 3 吴政平 董事 4 杨祉雄 董事 5 黄涌 董事 6 徐石* 经理 7 林丹 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 杨祉雄 董事 3 马骏 董事 4 李小龙 董事 5 黄涌 董事 6 徐石* 经理 7 贾文新 监事","change_item":"董事"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"贾文新,黄涌,杨祉雄,徐石*,吴政平,林丹","after_content":"徐石*,杨祉雄,贾文新,黄涌,李小龙,马骏","change_item":"董事"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 贾文新 董事 3 吴政平 董事 4 杨祉雄 董事 5 黄涌 董事 6 徐石* 经理 7 林丹 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 马骏 董事 3 杨祉雄 董事 4 李小龙 董事 5 黄涌 董事 6 徐石* 经理 7 贾文新 监事","change_item":"董事"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 黄涌 董事 3 杨祉雄 董事 4 吴政平 董事 5 贾文新 董事 6 徐石* 经理 7 林丹 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 李小龙 董事 3 杨祉雄 董事 4 黄涌 董事 5 马骏 董事 6 徐石* 经理 7 贾文新 监事","change_item":"董事"},{"change_date":"2015-12-25","tag":"历史信息","before_content":"1 徐石 423.5 自然人股东;2 用友网络科技股份有限公司 350 法人股东;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;6 林丹 35.7 自然人股东;7 陶维浩 35.7 自然人股东;8 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;9 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;10 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;11 黄涌 10 自然人股东;12 杨祉雄 10 自然人股东;13 文杰 10 自然人股东;14 黄子茜 10 自然人股东;15 刘古泉 5 自然人股东;16 黄子萱 5 自然人股东","after_content":"1 徐石 423.5 自然人股东;2 深圳市信义一德信智一号创新投资管理企业(有限合伙) 131.78 法人股东;3 二六三网络通信股份有限公司 83.33 企业法人;4 共青城随锐融通创新投资中心(有限合伙) 79.56 法人股东;5 张屹 55.7 自然人股东;6 用友网络科技股份有限公司 55.33 法人股东;7 胡守云 49.4 自然人股东;8 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;9 林丹 35.7 自然人股东;10 陶维浩 35.7 自然人股东;11 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;12 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;13 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;14 杨祉雄 10 自然人股东;15 黄涌 10 自然人股东;16 黄子茜 10 自然人股东;17 文杰 10 自然人股东;18 刘古泉 5 自然人股东;19 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2015-11-27","tag":"历史信息","before_content":"1 徐石 423.5 自然人股东 2 用友网络科技股份有限公司 350 法人股东 3 张屹 55.7 自然人股东 4 胡守云 49.4 自然人股东 5 陶维浩 35.7 自然人股东 6 林丹 35.7 自然人股东 7 黄涌 10 自然人股东 8 黄子茜 10 自然人股东 9 文杰 10 自然人股东 10 杨祉雄 10 自然人股东 11 黄子萱 5 自然人股东 12 刘古泉 5 自然人股东","after_content":"1 徐石 423.5 自然人股东 2 用友网络科技股份有限公司 350 法人股东 3 张屹 55.7 自然人股东 4 胡守云 49.4 自然人股东 5 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东 6 林丹 35.7 自然人股东 7 陶维浩 35.7 自然人股东 8 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东 9 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东 10 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东 11 黄涌 10 自然人股东 12 杨祉雄 10 自然人股东 13 文杰 10 自然人股东 14 黄子茜 10 自然人股东 15 刘古泉 5 自然人股东 16 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2015-11-27","tag":"非历史信息","before_content":"胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","after_content":"成都恒泰祥云企业管理中心(有限合伙),法人股东,成都开泰祥云企业管理中心(有限合伙),法人股东,成都明泰祥云企业管理中心(有限合伙),法人股东,成都仁泰祥云企业管理中心(有限合伙),法人股东,胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2015-11-27","tag":"历史信息","before_content":"1 徐石 423.5 自然人股东;2 用友网络科技股份有限公司 350 法人股东;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 陶维浩 35.7 自然人股东;6 林丹 35.7 自然人股东;7 黄涌 10 自然人股东;8 黄子茜 10 自然人股东;9 文杰 10 自然人股东;10 杨祉雄 10 自然人股东;11 黄子萱 5 自然人股东;12 刘古泉 5 自然人股东","after_content":"1 徐石 423.5 自然人股东;2 用友网络科技股份有限公司 350 法人股东;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 成都恒泰祥云企业管理中心(有限合伙) 47 法人股东;6 林丹 35.7 自然人股东;7 陶维浩 35.7 自然人股东;8 成都开泰祥云企业管理中心(有限合伙) 24.22 法人股东;9 成都仁泰祥云企业管理中心(有限合伙) 21.22 法人股东;10 成都明泰祥云企业管理中心(有限合伙) 18.67 法人股东;11 黄涌 10 自然人股东;12 杨祉雄 10 自然人股东;13 文杰 10 自然人股东;14 黄子茜 10 自然人股东;15 刘古泉 5 自然人股东;16 黄子萱 5 自然人股东","change_item":"投资人"},{"change_date":"2015-11-27","tag":"历史信息","before_content":"1000万元","after_content":"1111.1111万元","change_item":"注册资本"},{"change_date":"2015-11-27","tag":"非历史信息","before_content":"其他有限责任公司","after_content":"有限责任公司(自然人投资或控股)","change_item":"企业类型"},{"change_date":"2015-11-27","tag":"非历史信息","before_content":"1000万","after_content":"1111.1111万","change_item":"注册资本"},{"change_date":"2015-11-27","tag":"历史信息","before_content":"1 徐石 自然人股东 2 用友网络科技股份有限公司 法人股东 3 张屹 自然人股东 4 胡守云 自然人股东 5 陶维浩 自然人股东 6 林丹 自然人股东 7 黄涌 自然人股东 8 黄子茜 自然人股东 9 文杰 自然人股东 10 杨祉雄 自然人股东 11 黄子萱 自然人股东 12 刘古泉 自然人股东","after_content":"1 徐石 自然人股东 2 用友网络科技股份有限公司 法人股东 3 张屹 自然人股东 4 胡守云 自然人股东 5 成都恒泰祥云企业管理中心(有限合伙) 法人股东 6 林丹 自然人股东 7 陶维浩 自然人股东 8 成都开泰祥云企业管理中心(有限合伙) 法人股东 9 成都仁泰祥云企业管理中心(有限合伙) 法人股东 10 成都明泰祥云企业管理中心(有限合伙) 法人股东 11 黄涌 自然人股东 12 杨祉雄 自然人股东 13 文杰 自然人股东 14 黄子茜 自然人股东 15 刘古泉 自然人股东 16 黄子萱 自然人股东","change_item":"投资人"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"1 徐石 董事长;2 文杰 董事;3 胡守云 董事;4 吴政平 董事;5 贾文新 董事;6 徐石 经理;7 黄涌 监事","after_content":"1 徐石 董事长;2 贾文新 董事;3 吴政平 董事;4 杨祉雄 董事;5 黄涌 董事;6 徐石 经理;7 林丹 监事","change_item":"董事"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"-","after_content":"-","change_item":"股东情况"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"1 徐石 433.5 自然人股东;2 用友软件股份有限公司 350 其他非自然人投资者;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 陶维浩 35.7 自然人股东;6 林丹 35.7 自然人股东;7 文杰 20 自然人股东;8 黄子茜 10 自然人股东;9 黄子萱 10 自然人股东","after_content":"1 徐石 423.5 自然人股东;2 用友网络科技股份有限公司 350 法人股东;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 陶维浩 35.7 自然人股东;6 林丹 35.7 自然人股东;7 黄涌 10 自然人股东;8 黄子茜 10 自然人股东;9 文杰 10 自然人股东;10 杨祉雄 10 自然人股东;11 黄子萱 5 自然人股东;12 刘古泉 5 自然人股东","change_item":"投资人"},{"change_date":"2015-11-05","tag":"非历史信息","before_content":"胡守云,黄涌,贾文新,文杰,吴政平,徐石*","after_content":"黄涌,贾文新,林丹,吴政平,徐石*,杨祉雄","change_item":"董事"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 张屹 自然人股东 4 胡守云 自然人股东 5 陶维浩 自然人股东 6 林丹 自然人股东 7 文杰 自然人股东 8 黄子茜 自然人股东 9 黄子萱 自然人股东","after_content":"1 徐石 自然人股东 2 用友网络科技股份有限公司 法人股东 3 张屹 自然人股东 4 胡守云 自然人股东 5 陶维浩 自然人股东 6 林丹 自然人股东 7 黄涌 自然人股东 8 黄子茜 自然人股东 9 文杰 自然人股东 10 杨祉雄 自然人股东 11 黄子萱 自然人股东 12 刘古泉 自然人股东","change_item":"投资人"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"黄子萱,10,自然人股东,陶维浩,35.7,自然人股东,胡守云,49.4,自然人股东,林丹,35.7,自然人股东,张屹,55.7,自然人股东,徐石,433.5,自然人股东,文杰,20,自然人股东,黄子茜,10,自然人股东,用友软件股份有限公司,350","after_content":"徐石,423.5,自然人股东,文杰,10,自然人股东,黄子茜,10,自然人股东,黄子萱,5,自然人股东,用友网络科技股份有限公司,350,法人股东,杨祉雄,10,自然人股东,刘古泉,5,自然人股东,陶维浩,35.7,自然人股东,胡守云,49.4,自然人股东,林丹,35.7,自然人股东,张屹,55.7,自然人股东,黄涌,10,自然人股东","change_item":"股东情况"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"黄涌,徐石*,贾文新,吴政平,文杰,胡守云","after_content":"黄涌,杨祉雄,徐石*,贾文新,吴政平,林丹","change_item":"董事"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"徐石用友软件股份有限公司张屹胡守云陶维浩林丹文杰黄子茜黄子萱","after_content":"徐石用友网络科技股份有限公司张屹胡守云陶维浩林丹黄涌黄子茜文杰杨祉雄黄子萱刘古泉","change_item":"股东情况"},{"change_date":"2015-11-05","tag":"非历史信息","before_content":"胡守云,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,用友软件股份有限公司,,张屹,自然人股东","after_content":"胡守云,自然人股东,黄涌,自然人股东,黄子茜,自然人股东,黄子萱,自然人股东,林丹,自然人股东,刘古泉,自然人股东,陶维浩,自然人股东,文杰,自然人股东,徐石,自然人股东,杨祉雄,自然人股东,用友网络科技股份有限公司,法人股东,张屹,自然人股东","change_item":"投资人"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"-","after_content":"用友软件股份有限公司用友网络科技股份有限公司胡守云张屹张屹胡守云林丹陶维浩陶维浩林丹","change_item":"股东情况"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 贾文新 董事 3 文杰 董事 4 胡守云 董事 5 吴政平 董事 6 徐石* 经理 7 黄涌 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 黄涌 董事 3 杨祉雄 董事 4 吴政平 董事 5 贾文新 董事 6 徐石* 经理 7 林丹 监事","change_item":"董事"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"张屹用友软件股份有限公司徐石文杰陶维浩林丹黄子萱黄子茜胡守云","after_content":"张屹用友网络科技股份有限公司杨祉雄徐石文杰陶维浩刘古泉林丹黄子萱黄子茜黄涌胡守云","change_item":"股东情况"},{"change_date":"2015-11-05","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 文杰 董事 3 胡守云 董事 4 吴政平 董事 5 贾文新 董事 6 徐石* 经理 7 黄涌 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 贾文新 董事 3 吴政平 董事 4 杨祉雄 董事 5 黄涌 董事 6 徐石* 经理 7 林丹 监事","change_item":"董事"},{"change_date":"2015-10-21","tag":"历史信息","before_content":"张屹,吴政平,佘琰,徐石*,贾文新,陶维浩","after_content":"黄涌,徐石*,贾文新,吴政平,文杰,胡守云","change_item":"董事"},{"change_date":"2015-10-21","tag":"非历史信息","before_content":"贾文新,陶维浩,吴政平,徐石*,张屹,佘琰","after_content":"胡守云,黄涌,贾文新,文杰,吴政平,徐石*","change_item":"董事"},{"change_date":"2015-10-21","tag":"历史信息","before_content":"1 徐石 董事长;2 吴政平 董事;3 张屹 董事;4 陶维浩 董事;5 贾文新 董事;6 徐石 经理;7 佘琰 监事","after_content":"1 徐石 董事长;2 文杰 董事;3 胡守云 董事;4 吴政平 董事;5 贾文新 董事;6 徐石 经理;7 黄涌 监事","change_item":"董事"},{"change_date":"2015-10-21","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 陶维浩 董事 3 张屹 董事 4 贾文新 董事 5 吴政平 董事 6 徐石* 经理 7 佘琰 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 贾文新 董事 3 文杰 董事 4 胡守云 董事 5 吴政平 董事 6 徐石* 经理 7 黄涌 监事","change_item":"董事"},{"change_date":"2015-10-21","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 吴政平 董事 3 张屹 董事 4 陶维浩 董事 5 贾文新 董事 6 徐石* 经理 7 佘琰 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 文杰 董事 3 胡守云 董事 4 吴政平 董事 5 贾文新 董事 6 徐石* 经理 7 黄涌 监事","change_item":"董事"},{"change_date":"2015-03-31","tag":"历史信息","before_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)公积金出资461.54万元","after_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动。","change_item":"经营范围"},{"change_date":"2015-03-31","tag":"非历史信息","before_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日);技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)(公积金出资461.54万元)","after_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日);技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动。)","change_item":"经营范围"},{"change_date":"2014-02-28","tag":"历史信息","before_content":"无","after_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 胡守云 自然人股东 4 张屹 自然人股东 5 林丹 自然人股东 6 陶维浩 自然人股东","change_item":"出资情况"},{"change_date":"2013-05-17","tag":"历史信息","before_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)(公积金出资461.54万元)","after_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日);技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)(公积金出资461.54万元)","change_item":"经营范围"},{"change_date":"2013-05-17","tag":"历史信息","before_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)公积金出资461.54万元","after_content":"第二类增值电信业务中的信息服务业务(不含固定网电话信息服务和互联网信息服务)(增值电信业务经营许可证有效期至2018年03月15日)。技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)公积金出资461.54万元","change_item":"经营范围"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"1 徐石 233.45 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 张屹 30 自然人股东 4 胡守云 26.62 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东 7 文杰 10.77 自然人股东 8 黄子萱 5.39 自然人股东 9 黄子茜 5.39 自然人股东","after_content":"1 徐石 433.5 自然人股东 2 用友软件股份有限公司 350 其他非自然人投资者 3 张屹 55.7 自然人股东 4 胡守云 49.4 自然人股东 5 陶维浩 35.7 自然人股东 6 林丹 35.7 自然人股东 7 文杰 20 自然人股东 8 黄子茜 10 自然人股东 9 黄子萱 10 自然人股东","change_item":"出资情况"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"538.46","after_content":"1000","change_item":"注册资本"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"1 徐石 233.45 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 张屹 30 自然人股东 4 胡守云 26.62 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东 7 文杰 10.77 自然人股东 8 黄子萱 5.39 自然人股东 9 黄子茜 5.39 自然人股东","after_content":"1 徐石 433.5 自然人股东 2 用友软件股份有限公司 350 其他非自然人投资者 3 张屹 55.7 自然人股东 4 胡守云 49.4 自然人股东 5 林丹 35.7 自然人股东 6 陶维浩 35.7 自然人股东 7 文杰 20 自然人股东 8 黄子茜 10 自然人股东 9 黄子萱 10 自然人股东","change_item":"出资情况"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"1 徐石 233.45 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 张屹 30 自然人股东;4 胡守云 26.62 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东;7 文杰 10.77 自然人股东;8 黄子萱 5.39 自然人股东;9 黄子茜 5.39 自然人股东","after_content":"1 徐石 433.5 自然人股东;2 用友软件股份有限公司 350 其他非自然人投资者;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 林丹 35.7 自然人股东;6 陶维浩 35.7 自然人股东;7 文杰 20 自然人股东;8 黄子茜 10 自然人股东;9 黄子萱 10 自然人股东","change_item":"出资情况"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"1 徐石 233.45 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 张屹 30 自然人股东;4 胡守云 26.62 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东;7 文杰 10.77 自然人股东;8 黄子萱 5.39 自然人股东;9 黄子茜 5.39 自然人股东","after_content":"1 徐石 433.5 自然人股东;2 用友软件股份有限公司 350 其他非自然人投资者;3 张屹 55.7 自然人股东;4 胡守云 49.4 自然人股东;5 陶维浩 35.7 自然人股东;6 林丹 35.7 自然人股东;7 文杰 20 自然人股东;8 黄子茜 10 自然人股东;9 黄子萱 10 自然人股东","change_item":"出资情况"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"538.46万元","after_content":"1000万元","change_item":"注册资本"},{"change_date":"2012-04-26","tag":"历史信息","before_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 张屹 自然人股东 4 胡守云 自然人股东 5 林丹 自然人股东 6 陶维浩 自然人股东 7 文杰 自然人股东 8 黄子萱 自然人股东 9 黄子茜 自然人股东","after_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 张屹 自然人股东 4 胡守云 自然人股东 5 陶维浩 自然人股东 6 林丹 自然人股东 7 文杰 自然人股东 8 黄子茜 自然人股东 9 黄子萱 自然人股东","change_item":"出资情况"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"北京市海淀区海淀大街38号楼银科大厦710","after_content":"北京市海淀区北坞村路甲25号静芯园N座","change_item":"地址"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"1 徐石 238.83 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 胡守云 32 自然人股东 4 张屹 30 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东 7 黄骁俭 10.77 自然人股东","after_content":"1 徐石 233.45 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 张屹 30 自然人股东 4 胡守云 26.62 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东 7 文杰 10.77 自然人股东 8 黄子萱 5.39 自然人股东 9 黄子茜 5.39 自然人股东","change_item":"出资情况"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"1 徐石 董事长;2 吴政平 董事;3 陶维浩 董事;4 张屹 董事;5 郭新平 董事;6 徐石 总经理;7 佘琰 监事","after_content":"1 徐石 董事长;2 吴政平 董事;3 张屹 董事;4 陶维浩 董事;5 贾文新 董事;6 徐石 经理;7 佘琰 监事","change_item":"董事"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 吴政平 董事 3 郭新平 董事 4 陶维浩 董事 5 张屹 董事 6 徐石* 总经理 7 佘琰 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 陶维浩 董事 3 张屹 董事 4 贾文新 董事 5 吴政平 董事 6 徐石* 经理 7 佘琰 监事","change_item":"董事"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 胡守云 自然人股东 4 张屹 自然人股东 5 林丹 自然人股东 6 陶维浩 自然人股东 7 黄骁俭 自然人股东","after_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 张屹 自然人股东 4 胡守云 自然人股东 5 林丹 自然人股东 6 陶维浩 自然人股东 7 文杰 自然人股东 8 黄子萱 自然人股东 9 黄子茜 自然人股东","change_item":"出资情况"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"应用软件服务。(法律、行政法规、国务院决定禁止的,不得经营;法律、行政法规、国务院决定规定应经许可的,经审批机关批准并经工商行政管理机关登记注册后方可经营;法律、行政法规、国务院决定未规定许可的,自主选择经营项目开展经营活动。)","after_content":"技术开发、技术转让、技术咨询、技术服务;计算机技术培训;基础软件服务;应用软件服务;计算机系统服务;销售计算机、软件及辅助设备、电子产品、机械设备。(未取得行政许可的项目除外)","change_item":"经营范围"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 郭新平 董事 3 张屹 董事 4 吴政平 董事 5 陶维浩 董事 6 徐石* 总经理 7 佘琰 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 吴政平 董事 3 张屹 董事 4 陶维浩 董事 5 贾文新 董事 6 徐石* 经理 7 佘琰 监事","change_item":"董事"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"1 徐石 238.83 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东;7 黄骁俭 10.77 自然人股东","after_content":"1 徐石 233.45 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 张屹 30 自然人股东;4 胡守云 26.62 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东;7 文杰 10.77 自然人股东;8 黄子萱 5.39 自然人股东;9 黄子茜 5.39 自然人股东","change_item":"出资情况"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"10","after_content":"50","change_item":"经营期限"},{"change_date":"2011-11-23","tag":"历史信息","before_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 吴政平 董事 3 陶维浩 董事 4 张屹 董事 5 郭新平 董事 6 徐石* 总经理 7 佘琰 监事","after_content":"(注:标有*标志的为法定代表人)1 徐石* 董事长 2 吴政平 董事 3 张屹 董事 4 陶维浩 董事 5 贾文新 董事 6 徐石* 经理 7 佘琰 监事","change_item":"董事"},{"change_date":"2010-12-28","tag":"历史信息","before_content":"1 徐石 249.6 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 胡守云 32 自然人股东 4 张屹 30 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东","after_content":"1 徐石 238.83 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 胡守云 32 自然人股东 4 张屹 30 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东 7 黄骁俭 10.77 自然人股东","change_item":"投资人"},{"change_date":"2010-12-28","tag":"历史信息","before_content":"法律、行政法规、国务院决定禁止的,不得经营;法律、行政法规、国务院决定规定应经许可的,经审批机关批准并经工商行政管理机关登记注册后方可经营;法律、行政法规、国务院决定未规定许可的,自主选择经营项目开展经营活动。","after_content":"应用软件服务。(法律、行政法规、国务院决定禁止的,不得经营;法律、行政法规、国务院决定规定应经许可的,经审批机关批准并经工商行政管理机关登记注册后方可经营;法律、行政法规、国务院决定未规定许可的,自主选择经营项目开展经营活动。)","change_item":"经营范围"},{"change_date":"2010-12-28","tag":"历史信息","before_content":"1 徐石 249.6 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东","after_content":"1 徐石 238.83 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东;7 黄骁俭 10.77 自然人股东","change_item":"投资人"},{"change_date":"2010-12-28","tag":"历史信息","before_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 胡守云 自然人股东 4 张屹 自然人股东 5 林丹 自然人股东 6 陶维浩 自然人股东","after_content":"1 徐石 自然人股东 2 用友软件股份有限公司 其他非自然人投资者 3 胡守云 自然人股东 4 张屹 自然人股东 5 林丹 自然人股东 6 陶维浩 自然人股东 7 黄骁俭 自然人股东","change_item":"投资人"},{"change_date":"2010-03-08","tag":"历史信息","before_content":"北京用友致远软件技术有限公司","after_content":"北京致远协创软件有限公司","change_item":"企业名称"},{"change_date":"2009-07-13","tag":"历史信息","before_content":"500万元","after_content":"538.46万元","change_item":"注册资本"},{"change_date":"2009-07-13","tag":"历史信息","before_content":"500","after_content":"538.46","change_item":"注册资本"},{"change_date":"2009-07-13","tag":"历史信息","before_content":"1 徐石 249.6 自然人股东 2 用友软件股份有限公司 150 其他非自然人投资者 3 胡守云 32 自然人股东 4 张屹 30 自然人股东 5 陶维浩 19.2 自然人股东 6 林丹 19.2 自然人股东","after_content":"1 徐石 249.6 自然人股东 2 用友软件股份有限公司 188.46 其他非自然人投资者 3 胡守云 32 自然人股东 4 张屹 30 自然人股东 5 林丹 19.2 自然人股东 6 陶维浩 19.2 自然人股东","change_item":"出资情况"},{"change_date":"2009-07-13","tag":"历史信息","before_content":"1 徐石 249.6 自然人股东;2 用友软件股份有限公司 150 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 陶维浩 19.2 自然人股东;6 林丹 19.2 自然人股东","after_content":"1 徐石 249.6 自然人股东;2 用友软件股份有限公司 188.46 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东","change_item":"出资情况"},{"change_date":"2009-01-08","tag":"历史信息","before_content":"1 徐石 249.6 自然人股东;2 用友软件股份有限公司 150 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 林丹 19.2 自然人股东;6 陶维浩 19.2 自然人股东","after_content":"1 徐石 249.6 自然人股东;2 用友软件股份有限公司 150 其他非自然人投资者;3 胡守云 32 自然人股东;4 张屹 30 自然人股东;5 陶维浩 19.2 自然人股东;6 林丹 19.2 自然人股东","change_item":"投资人"},{"change_date":"2009-01-08","tag":"历史信息","before_content":"1 徐石 董事长;2 张屹 董事;3 陶维浩 董事;4 郭新平 董事;5 吴政平 董事;6 徐石 总经理;7 佘琰 监事","after_content":"1 徐石 董事长;2 吴政平 董事;3 陶维浩 董事;4 张屹 董事;5 郭新平 董事;6 徐石 总经理;7 佘琰 监事","change_item":"主要人员"}],"business_info":{"end_date":"-","actual_capi":"11515.8439 万人民币","reg_no":"110108003727595","ind_type":"其他软件开发","city":"北京","validity_date":"-","act_region":"-","mplusType":11,"fen_name":"Beijing Seeyon Internet Software Corp.","type":"BJ","quoted_type":"[]","province":"BJ","check_date":"2023-09-26","scope":"一般项目:技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广;人工智能基础软件开发;网络与信息安全软件开发;软件开发;人工智能应用软件开发;软件销售;软件外包服务;人工智能理论与算法软件开发;计算机软硬件及辅助设备零售;信息系统集成服务;信息技术咨询服务;计算机系统服务;电子产品销售;机械设备销售;非居住房地产租赁;货物进出口;技术进出口。(除依法须经批准的项目外,凭营业执照依法自主开展经营活动)许可项目:第一类增值电信业务;第二类增值电信业务。(依法须经批准的项目,经相关部门批准后方可开展经营活动,具体经营项目以相关部门批准文件或许可证件为准)(不得从事国家和本市产业政策禁止和限制类项目的经营活动。)","contact":{"address":"北京市海淀区北坞村路甲25号静芯园M座","telephone":"010-82602233","email":"zhangxiu@seeyon.com"},"belong_org":"北京市海淀区市场监督管理局","term_end":"-","id":"1e89f4a8-5e6b-4e90-bb2b-bfd0d4d854d2","department":"北京市海淀区市场监督管理局","org_no":"737656338","start_date":"2002-04-02","econ_kind":"股份有限公司(上市、自然人投资或控股)","zip":"-","province1":"北京","case_no":"91110108737656338N","address":"北京市海淀区北坞村路甲25号静芯园M座","agency":"北京市海淀区市场监督管理局","reg_capi":"11515.8439 万人民币人民币","oper_name":"徐石","org_type":"股份有限公司(上市、自然人投资或控股)","domains":"其他软件开发","telephone":"-","history_names":"[\"北京用友致远软件技术有限公司\",\"北京致远协创软件有限公司\"]","people":"徐石","type_new":"01","credit_no":"91110108737656338N","term_start":"2002-04-02","domain":"-","name":"北京致远互联软件股份有限公司","websites":[{"seq_no":"1","date":"2020-12-24","web_url":"www.seeyon.com","web_type":"网站","source":"s6","web_name":"致远互联"},{"seq_no":"1","date":"2023-04-26","web_url":"www.seeyon.com","web_type":"网站","source":"s4","web_name":"公司官网"}],"is_quoted":"0","regist_capi":"11515.8439 万元人民币","status":"存续(在营、开业、在册)"},"partners":[{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"文杰","identify_type":"-","total_real_capi":"-","total_should_capi":"45 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"45 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"黄子萱","identify_type":"-","total_real_capi":"-","total_should_capi":"45 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"45 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"913604053276970737","real_capi_items":[],"name":"共青城随锐融通创新投资中心(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"358 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"358 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"91510100350638135K","real_capi_items":[],"name":"成都开泰祥云企业管理中心(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"109 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"109 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"916540023287580776","real_capi_items":[],"name":"新疆五五绿洲壹期股权投资合伙企业(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"50 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"50 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"91510100350638143E","real_capi_items":[],"name":"成都仁泰祥云企业管理中心(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"95.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"95.5 万人民币","invest_type":"其他"}]},{"stock_type":"法人股东","identify_no":"91510100350638119X","real_capi_items":[],"name":"成都恒泰祥云企业管理中心(有限合伙)","identify_type":"企业法人营业执照(公司)","total_real_capi":"-","total_should_capi":"211.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"211.5 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"张屹","identify_type":"-","total_real_capi":"-","total_should_capi":"125.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"125.5 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"徐石","identify_type":"-","total_real_capi":"-","total_should_capi":"1781 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"1781 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"91110000700347267E","real_capi_items":[],"name":"二六三网络通信股份有限公司","identify_type":"企业法人营业执照(公司)","total_real_capi":"-","total_should_capi":"375 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"375 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"914403003593131187","real_capi_items":[],"name":"深圳昀润创新投资合伙企业(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"75 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"75 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"黄涌","identify_type":"-","total_real_capi":"-","total_should_capi":"45 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"45 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"黄子茜","identify_type":"-","total_real_capi":"-","total_should_capi":"22.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"22.5 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"91510100MA61R8NJXX","real_capi_items":[],"name":"成都明泰祥云企业管理中心(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"84 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"84 万人民币","invest_type":"其他"}]},{"stock_type":"企业法人","identify_no":"9144030035945624X8","real_capi_items":[],"name":"深圳市信义一德信智一号创新投资管理企业(有限合伙)","identify_type":"合伙企业营业执照","total_real_capi":"-","total_should_capi":"593 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"593 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"胡守云","identify_type":"-","total_real_capi":"-","total_should_capi":"222.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"222.5 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"林丹","identify_type":"-","total_real_capi":"-","total_should_capi":"160.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"160.5 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"唐海蓉","identify_type":"-","total_real_capi":"-","total_should_capi":"100 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"100 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"陶维浩","identify_type":"-","total_real_capi":"-","total_should_capi":"160.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"160.5 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"李兴旺","identify_type":"-","total_real_capi":"-","total_should_capi":"25 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"25 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"刘古泉","identify_type":"-","total_real_capi":"-","total_should_capi":"22.5 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"22.5 万人民币","invest_type":"其他"}]},{"stock_type":"自然人股东","identify_no":"-","real_capi_items":[],"name":"杨祉雄","identify_type":"-","total_real_capi":"-","total_should_capi":"45 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"45 万人民币","invest_type":"其他"}]},{"stock_type":"法人股东","identify_no":"91110000600001760P","real_capi_items":[],"name":"用友网络科技股份有限公司","identify_type":"企业法人营业执照(公司)","total_real_capi":"-","total_should_capi":"249 万人民币","should_capi_items":[{"should_capi_date":"2016-03-31","shoud_capi":"249 万人民币","invest_type":"其他"}]}],"employees":[{"name":"严洁联","job_title":"董事,副总经理,财务负责人"},{"name":"刘瑞华","job_title":"监事会主席"},{"name":"向奇汉","job_title":"董事,副总经理"},{"name":"尹好鹏","job_title":"独立董事"},{"name":"徐景峰","job_title":"独立董事"},{"name":"徐石","job_title":"总经理,董事长"},{"name":"朱岩","job_title":"董事"},{"name":"李伟民","job_title":"监事"},{"name":"李海旺","job_title":"监事"},{"name":"段芳","job_title":"副总经理"},{"name":"王志成","job_title":"独立董事"},{"name":"谭敏锋","job_title":"副总经理"},{"name":"马文","job_title":"副总经理"}],"branches":[{"name":"北京致远互联软件股份有限公司山东分公司"},{"name":"北京致远互联软件股份有限公司上海分公司"},{"name":"北京致远互联软件股份有限公司海南分公司"},{"name":"北京致远互联软件股份有限公司安徽分公司"},{"name":"北京致远互联软件股份有限公司河南分公司"},{"name":"北京致远互联软件股份有限公司黑龙江分公司"},{"name":"北京致远互联软件股份有限公司山西分公司"},{"name":"北京致远互联软件股份有限公司江西分公司"},{"name":"北京致远互联软件股份有限公司重庆分公司"},{"name":"北京致远互联软件股份有限公司宁夏分公司"},{"name":"北京致远互联软件股份有限公司天津分公司"},{"name":"北京致远互联软件股份有限公司云南分公司"},{"name":"北京致远互联软件股份有限公司福建分公司"},{"name":"北京致远互联软件股份有限公司广西分公司"},{"name":"北京致远互联软件股份有限公司甘肃分公司"},{"name":"北京致远互联软件股份有限公司新疆分公司"},{"name":"北京致远互联软件股份有限公司宁波分公司"},{"name":"北京致远互联软件股份有限公司吉林分公司"},{"name":"北京致远互联软件股份有限公司湖北分公司"},{"name":"北京致远互联软件股份有限公司辽宁分公司"},{"name":"北京致远互联软件股份有限公司成都分公司"},{"name":"北京致远互联软件股份有限公司苏州分公司"},{"name":"北京致远互联软件股份有限公司深圳分公司"},{"name":"北京致远互联软件股份有限公司河北分公司"},{"name":"北京致远互联软件股份有限公司成都高新分公司"},{"name":"北京致远互联软件股份有限公司江苏分公司"},{"name":"北京致远互联软件股份有限公司贵州分公司"},{"name":"北京致远互联软件股份有限公司大连分公司"},{"name":"北京致远互联软件股份有限公司厦门分公司"},{"name":"北京致远互联软件股份有限公司北京分公司"},{"name":"北京致远互联软件股份有限公司青岛分公司"},{"name":"北京致远互联软件股份有限公司内蒙古分公司"},{"name":"北京致远互联软件股份有限公司无锡分公司"},{"name":"北京致远互联软件股份有限公司浙江分公司"},{"name":"北京致远互联软件股份有限公司南通分公司"},{"name":"北京致远互联软件股份有限公司贵阳分公司"},{"name":"北京致远互联软件股份有限公司常州分公司"},{"name":"北京致远互联软件股份有限公司湖南分公司"}],"abnormal_items":[],"url":"||"} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/util/BipHttpUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/util/BipHttpUtil.java new file mode 100644 index 0000000..e09978d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/util/BipHttpUtil.java @@ -0,0 +1,62 @@ +package com.seeyon.apps.bip.util; + +import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.crypto.digest.MD5; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONObject; +import com.kg.commons.utils.MD5Util; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.ctp.util.json.JSONUtil; +import org.springframework.util.DigestUtils; + +import java.util.Base64; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/30 + */ +public class BipHttpUtil { + + private BipHttpUtil() { + + } + + public static String doPost(String url, String body, String clientId, String security) throws Exception { + String ts = System.currentTimeMillis() + ""; + String signature = ts + security; + byte[] bytes = DigestUtils.md5Digest(signature.getBytes("UTF-8")); + signature = Base64.getEncoder().encodeToString(bytes); + return HttpRequest.post(url).header("Content-Type", "application/json;charset=utf-8") + .header("ts", ts) + .header("signature", signature) + .header("client_id", clientId) + .body(body).execute().body(); + } + + public static BipResponse parseResponse(String response) throws Exception { + try { + JSONObject object = JSONUtil.parseJSONString(response, JSONObject.class); + return new BipResponse(object); + } catch (Exception e) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("Status", "0"); + jsonObject.put("Msg", "解析json异常"); + jsonObject.put("Data", response); + return new BipResponse(jsonObject); + } + } + + + + public static void main(String[] args) { + String url = "http://10.1.90.21:9083/servlet/NCTokenServlet?dsname=BIPcs&usercode=UFYJY&system=OA&busicentercode=sxbip"; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/vo/BipResponse.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/vo/BipResponse.java new file mode 100644 index 0000000..9e11be6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/vo/BipResponse.java @@ -0,0 +1,72 @@ +package com.seeyon.apps.bip.vo; + +import com.alibaba.fastjson.JSONObject; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class BipResponse { + + private boolean success; + private int status; + private String msg; + private String data; + + + public BipResponse(JSONObject object) { + if(object.containsKey("Status")) { + this.status = object.getInteger("Status"); + } else { + this.status = object.getInteger("status"); + } + this.success = (1 == status); + if(object.containsKey("Msg")) { + this.msg = object.getString("Msg"); + } else { + this.msg = object.getString("msg"); + } + this.data = object.getString("Data"); + } + + public boolean isSuccess() { + return success; + } + + public BipResponse setSuccess(boolean success) { + this.success = success; + return this; + } + + public int getStatus() { + return status; + } + + public BipResponse setStatus(int status) { + this.status = status; + return this; + } + + public String getMsg() { + return msg; + } + + public BipResponse setMsg(String msg) { + this.msg = msg; + return this; + } + + public String getData() { + return data; + } + + public BipResponse setData(String data) { + this.data = data; + return this; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanDiaochuNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanDiaochuNode.java new file mode 100644 index 0000000..66e3b0e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanDiaochuNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.zichan.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class ZichanDiaochuNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_deployOutServlet"; + } + + @Override + public String getNodeId() { + return "zichanDiaochuNode"; + } + + @Override + public String getNodeName() { + return "资产调出推送BIP"; + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanJianshaoNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanJianshaoNode.java new file mode 100644 index 0000000..35cd9e7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanJianshaoNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.zichan.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class ZichanJianshaoNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_reduceServlet"; + } + + @Override + public String getNodeId() { + return "zichanJianshaoNode"; + } + + @Override + public String getNodeName() { + return "资产减少推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanXinzengNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanXinzengNode.java new file mode 100644 index 0000000..6960b46 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanXinzengNode.java @@ -0,0 +1,39 @@ +package com.seeyon.apps.bip.zichan.node; + +import com.seeyon.apps.bip.BIPCommonNode; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.bip.util.BipHttpUtil; +import com.seeyon.apps.bip.vo.BipResponse; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class ZichanXinzengNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_facardServlet"; + } + + @Override + public String getNodeId() { + return "zichanXinzengNode"; + } + + @Override + public String getNodeName() { + return "资产新增推送BIP"; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanYanshouNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanYanshouNode.java new file mode 100644 index 0000000..3e2c99a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zichan/node/ZichanYanshouNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.zichan.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/12/1 + */ +public class ZichanYanshouNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_fanewassetServlet"; + } + + @Override + public String getNodeId() { + return "zichanYanshouNode"; + } + + @Override + public String getNodeName() { + return "资产验收推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/ChailvFukuanNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/ChailvFukuanNode.java new file mode 100644 index 0000000..d75bb82 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/ChailvFukuanNode.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.bip.zijin.node; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public class ChailvFukuanNode extends FukuanParentNode { + + @Override + public String getNodeId() { + return "chailvFukuanNode"; + } + + @Override + public String getNodeName() { + return "差旅报销审批单推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/FukuanParentNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/FukuanParentNode.java new file mode 100644 index 0000000..a0e6c93 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/FukuanParentNode.java @@ -0,0 +1,20 @@ +package com.seeyon.apps.bip.zijin.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public abstract class FukuanParentNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_paybillServlet"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/JituanzijinFukuanNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/JituanzijinFukuanNode.java new file mode 100644 index 0000000..7622ae5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/JituanzijinFukuanNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.bip.zijin.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public class JituanzijinFukuanNode extends BIPCommonNode { + + @Override + public String getNodeId() { + return "jituanzijinFukuanNode"; + } + + @Override + public String getNodeName() { + return "集团募集资金支付推送BIP"; + } + + @Override + public String getMethod() { + return "/service/sxly_oa_mjzjPaybillServlet"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/TongyongFenZhangNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/TongyongFenZhangNode.java new file mode 100644 index 0000000..4d1e108 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/TongyongFenZhangNode.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.bip.zijin.node; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public class TongyongFenZhangNode extends FukuanParentNode { + + @Override + public String getNodeId() { + return "tongyongFenZhangNode"; + } + + @Override + public String getNodeName() { + return "通用分账审批单推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/TongyongFukuanNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/TongyongFukuanNode.java new file mode 100644 index 0000000..1a668b7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/TongyongFukuanNode.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.bip.zijin.node; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public class TongyongFukuanNode extends FukuanParentNode { + + @Override + public String getNodeId() { + return "tongyongFukuanNode"; + } + + @Override + public String getNodeName() { + return "通用支付审批单推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/YuFukuanNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/YuFukuanNode.java new file mode 100644 index 0000000..94b870a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bip/zijin/node/YuFukuanNode.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.bip.zijin.node; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/11/29 + */ +public class YuFukuanNode extends FukuanParentNode { + + @Override + public String getNodeId() { + return "yuFukuanNode"; + } + + @Override + public String getNodeName() { + return "预付款申请单单推送BIP"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/bipsync/aop/NcHrSynAspect.java b/v5/apps-customize/src/main/java/com/seeyon/apps/bipsync/aop/NcHrSynAspect.java new file mode 100644 index 0000000..05c6b4d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/bipsync/aop/NcHrSynAspect.java @@ -0,0 +1,243 @@ +package com.seeyon.apps.bipsync.aop; + +import com.seeyon.apps.cip.organization.util.DataBaseUtils; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.MapListHandler; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; + +import javax.script.ScriptException; +import java.sql.Connection; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import static com.seeyon.ctp.common.formula.FormulaUtil.getVar; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2021/10/9 + */ +@Aspect +public class NcHrSynAspect { + public static List data = new ArrayList(); + public SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + static { + data.add("201"); + data.add("202"); + data.add("203"); + data.add("204"); + data.add("210"); + } + + private static final Log log = LogFactory.getLog(NcHrSynAspect.class); + + @Pointcut("execution(public * com.seeyon.apps.cip.organization.manager.impl.CipSynOperationManagerImpl.handOperation(..))))") + private void handOperation() { + } + + @Pointcut("execution(public * com.seeyon.apps.cip.organization.manager.impl.CipSynOperationManagerImpl.autoOperation(..))))") + private void autoOperation() { + } + + @Before(value = "autoOperation() || handOperation()") + public void before(JoinPoint joinPoint) { + + } + + @AfterReturning(value = "autoOperation() || handOperation()", + returning = "result") + public void after(JoinPoint joinPoint, Object result) { + // 同步部门HRG角色 + String driver = null; + String url = null; + String user = null; + String pwd = null; + try { + driver = (String) getVar("orgSync.driver"); + url = (String) getVar("orgSync.url"); + user = (String) getVar("orgSync.user"); + pwd = (String) getVar("orgSync.pwd"); + } catch (ScriptException | BusinessException e) { + log.error("获取参数失败!"); + } + Connection srcCon = null; + Connection desCon = null; + try { + srcCon = DataBaseUtils.getInstance().getConnection(StringUtils.isBlank(driver) ? "oracle.jdbc.driver.OracleDriver" : driver, StringUtils.isBlank(url) ? "jdbc:oracle:thin:@10.1.90.21:1521:orcl" : url, StringUtils.isBlank(user) ? "bip2oa" : user, StringUtils.isBlank(pwd) ? "sxlybip2022oa" : pwd); + desCon = JDBCAgent.getDataSource().getConnection(); + srcCon.setAutoCommit(false); + desCon.setAutoCommit(false); + syncGroupToMidDB(srcCon, desCon); + syncUnitToMidDb(srcCon, desCon); + syncDeptToMidDb(srcCon, desCon); + syncPostToMidDb(srcCon, desCon); + syncLevelMidDB(srcCon, desCon); + syncPersonToMidDb(srcCon, desCon); + syncPersonBaseToMidDb(srcCon, desCon); + syncPersonPartMidDB(srcCon, desCon); + desCon.commit(); + } catch (Exception e) { + log.error("数据同步异常", e); + } finally { + if (srcCon != null) { + try { + srcCon.close(); + } catch (Exception e) { + } + } + if (desCon != null) { + try { + desCon.close(); + } catch (Exception e) { + } + } + } + } + + void syncGroupToMidDB(Connection srcCon, Connection desCon) throws Exception { + QueryRunner queryRunner = new QueryRunner(true); + List> rows = queryRunner.query(srcCon, "SELECT * FROM MID_ORG_GROUP ", new MapListHandler()); + queryRunner.update(desCon, "delete from MID_ORG_GROUP"); + for (Map row : rows) { + queryRunner.insert(desCon, + "INSERT INTO MID_ORG_GROUP (ID, CODE, NAME, SHORT_NAME, PARENTID, IS_ENABLE, IS_DELETED, UPDATE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", new MapListHandler(), + row.get("ID"), row.get("CODE"), row.get("NAME"), row.get("SHORT_NAME"), row.get("PARENTID"), row.get("IS_ENABLE"), row.get("IS_DELETED"), new Timestamp(format.parse(String.valueOf(row.get("UPDATE_TIME"))).getTime())); + } + } + + void syncUnitToMidDb(Connection srcCon, Connection desCon) throws Exception { + QueryRunner queryRunner = new QueryRunner(true); + List> rows = queryRunner.query(srcCon, "select * from mid_org_unit where code in (" + StringUtils.join(data.stream().map(p->"'"+p+"'").collect(Collectors.toList()), ",") + ")", new MapListHandler()); + queryRunner.update(desCon, "delete from MID_ORG_UNIT"); + for (Map row : rows) { + //只取部分单位的人员 + queryRunner.insert(desCon, + "INSERT INTO MID_ORG_UNIT (ID, CODE, NAME, SHORT_NAME, GROUPID, PARENTID, IS_ENABLE, IS_DELETED, UPDATE_TIME) VALUES (?, ?, ?, ?,?, ?,?, ?, ?)", new MapListHandler(), + row.get("ID"), row.get("CODE"), row.get("NAME"), row.get("SHORT_NAME"), row.get("GROUPID"), row.get("PARENTID"), row.get("IS_ENABLE"), row.get("IS_DELETED"), new Timestamp(format.parse(String.valueOf(row.get("UPDATE_TIME"))).getTime())); + } + } + + void syncDeptToMidDb(Connection srcCon, Connection desCon) throws Exception { + QueryRunner queryRunner = new QueryRunner(true); + //换成ID + List> rows = queryRunner.query(srcCon, "SELECT * FROM MID_ORG_DEPARTMENT where UNITID in( select ID from mid_org_unit where code in (" + StringUtils.join(data.stream().map(p->"'"+p+"'").collect(Collectors.toList()), ",") + "))", new MapListHandler()); + queryRunner.update(desCon, "delete from MID_ORG_DEPARTMENT"); + for (Map row : rows) { + //只取部分单位的人员 + queryRunner.insert(desCon, + "INSERT INTO MID_ORG_DEPARTMENT (ID, CODE, NAME, UNITID, GROUPID, PARENTID, DEPARTMANAGERS, IS_ENABLE, IS_DELETED, UPDATE_TIME,EXT_ATTR_1,EXT_ATTR_2) VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", new MapListHandler(), + row.get("ID"), row.get("CODE"), row.get("NAME"), row.get("UNITID"), row.get("GROUPID"), row.get("PARENTID"), row.get("DEPARTMANAGERS"), row.get("IS_ENABLE"), row.get("IS_DELETED"), new Timestamp(format.parse(String.valueOf(row.get("UPDATE_TIME"))).getTime()), "部门", row.get("CODE")); + } + + for (String datum : data) { + //需求 把202开头的单位同步成部门 + List> unitRows = queryRunner.query(srcCon, "select * from MID_ORG_UNIT where code = ? ", new MapListHandler(), datum); + log.error("编码调试:" + unitRows.size()); + Map unitMap = unitRows.get(0); + List> rowUnits = queryRunner.query(srcCon, "select * from MID_ORG_UNIT where code like ? and code != ?", new MapListHandler(), datum + "%", datum); + //当作部门 + for (Map rowUnit : rowUnits) { + Object code = "A" + rowUnit.get("CODE"); + queryRunner.insert(desCon, "INSERT INTO MID_ORG_DEPARTMENT (ID, CODE, NAME, UNITID, GROUPID, PARENTID, DEPARTMANAGERS, IS_ENABLE, IS_DELETED, UPDATE_TIME,EXT_ATTR_1,EXT_ATTR_2) VALUES (?,?, ?, ?, ?, ?, ?, ?,?, ?,?,?)", new MapListHandler(), + rowUnit.get("ID"), code, rowUnit.get("NAME"), unitMap.get("ID"), rowUnit.get("GROUPID"), rowUnit.get("PARENTID"), null, rowUnit.get("IS_ENABLE"), rowUnit.get("IS_DELETED"), new Timestamp(format.parse(String.valueOf(rowUnit.get("UPDATE_TIME"))).getTime()), "单位", rowUnit.get("CODE")); + //单位下的部门 + List> unitDepts = queryRunner.query(srcCon, "select * from MID_ORG_DEPARTMENT where unitId = ? ", new MapListHandler(), rowUnit.get("ID")); + for (Map row : unitDepts) { + //这里加上前缀是因为同步到部门的单位下可能编码回重复 + Object deptCode = "D" + String.valueOf(row.get("CODE")); + Object parentid = row.get("PARENTID"); + if (Objects.equals(parentid, "~")) { + parentid = rowUnit.get("ID"); + } + queryRunner.insert(desCon, + "INSERT INTO MID_ORG_DEPARTMENT (ID, CODE, NAME, UNITID, GROUPID, PARENTID, DEPARTMANAGERS, IS_ENABLE, IS_DELETED, UPDATE_TIME,EXT_ATTR_1,EXT_ATTR_2) VALUES (?,?, ?, ?, ?, ?, ?, ?,?, ?,?,?)", new MapListHandler(), + row.get("ID"), deptCode, row.get("NAME"), unitMap.get("ID"), row.get("GROUPID"), parentid, row.get("DEPARTMANAGERS"), row.get("IS_ENABLE"), row.get("IS_DELETED"), new Timestamp(format.parse(String.valueOf(row.get("UPDATE_TIME"))).getTime()), "部门", row.get("CODE")); + } + } + } + } + + void syncLevelMidDB(Connection srcCon, Connection desCon) throws Exception { +// QueryRunner queryRunner = new QueryRunner(true); +// List> rows = queryRunner.query(srcCon, "SELECT * FROM MID_ORG_JOB ", new MapListHandler()); +// queryRunner.update(desCon, "delete from MID_ORG_JOB"); +// for (Map row : rows) { +// //只取部分单位的人员 +// queryRunner.insert(desCon, +// "INSERT INTO MID_ORG_JOB (ID, NAME, CODE, SORT, UNITID, IS_ENABLE, IS_DELETED, UPDATE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", new MapListHandler(), +// row.get("ID"), row.get("NAME"), row.get("CODE"), row.get("SORT"), row.get("UNITID"), row.get("IS_ENABLE"), row.get("IS_DELETED"), row.get("UPDATE_TIME")); +// } + } + + void syncPostToMidDb(Connection srcCon, Connection desCon) throws Exception { +// QueryRunner queryRunner = new QueryRunner(true); +// List> rows = queryRunner.query(srcCon, "SELECT * FROM MID_ORG_POST ", new MapListHandler()); +// queryRunner.update(desCon, "delete from MID_ORG_POST"); +// for (Map row : rows) { +// //只取部分单位的人员 +// queryRunner.insert(desCon, "INSERT INTO MID_ORG_POST (ID, NAME, CODE, ENTITYID, DEPARTMENTID, IS_RESPONPOST, IS_ENABLE, IS_DELETED, UPDATE_TIME, EXT_ATTR_1, EXT_ATTR_2, EXT_ATTR_3, EXT_ATTR_4, EXT_ATTR_5, EXT_ATTR_6, EXT_ATTR_7, EXT_ATTR_8, EXT_ATTR_9, EXT_ATTR_10) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", +// new MapListHandler(), row.get("ID"), row.get("NAME"), row.get("CODE"), row.get("ENTITYID"), row.get("DEPARTMENTID"), row.get("IS_RESPONPOST"), row.get("IS_ENABLE"), row.get("IS_DELETED"), row.get("UPDATE_TIME"), row.get("EXT_ATTR_1"), row.get("EXT_ATTR_2"), row.get("EXT_ATTR_3"), row.get("EXT_ATTR_4"), row.get("EXT_ATTR_5"), +// row.get("EXT_ATTR_6"), row.get("EXT_ATTR_7"), row.get("EXT_ATTR_8"), row.get("EXT_ATTR_9"), row.get("EXT_ATTR_10")); +// } + } + + void syncPersonToMidDb(Connection srcCon, Connection desCon) throws Exception { + QueryRunner queryRunner = new QueryRunner(true); + queryRunner.update(desCon, "delete from MID_ORG_PERSON"); + for (String datum : data) { + List> rows = queryRunner.query(srcCon, "SELECT * FROM MID_ORG_PERSON ", new MapListHandler()); + List> unitRows = queryRunner.query(srcCon, "select * from MID_ORG_UNIT where code = ?", new MapListHandler(), datum); + log.error("编码调试:" + unitRows.size()); + Map unitMap = unitRows.get(0); + List> rowUnits = queryRunner.query(srcCon, "select * from MID_ORG_UNIT where code like ? ", new MapListHandler(), datum + "%"); + //单位下的ID集合 + List unitIds = rowUnits.stream().map(p -> String.valueOf(p.get("ID"))).collect(Collectors.toList()); + for (Map row : rows) { + //只取部分单位的人员 + String unitId = null; + //当前人员在部门集合里面证明是这个单位下的人员 + if (unitIds.contains(String.valueOf(row.get("UNITID")))) { + unitId = String.valueOf(unitMap.get("ID")); + } + if (unitId == null){ + continue; + } + queryRunner.insert(desCon, "INSERT INTO MID_ORG_PERSON (ID, PERSON_BASEID, STATE, NAME, CODE, LOGIN_NAME, DEPARTMENTID, UNITID, GROUPID, JOBID, POSTID, IS_ENABLE, IS_DELETED, IS_FINISH, UPDATE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", new MapListHandler(), + row.get("ID"), row.get("PERSON_BASEID"), row.get("STATE"), row.get("NAME"), row.get("CODE"), row.get("LOGIN_NAME"), row.get("DEPARTMENTID"), unitId, row.get("GROUPID"), row.get("JOBID"), row.get("POSTID"), row.get("IS_ENABLE"), row.get("IS_DELETED"), row.get("IS_FINISH"), new Timestamp(format.parse(String.valueOf(row.get("UPDATE_TIME"))).getTime())); + } + } + } + + void syncPersonBaseToMidDb(Connection srcCon, Connection desCon) throws Exception { + QueryRunner queryRunner = new QueryRunner(true); + List> rows = queryRunner.query(srcCon, "SELECT * FROM MID_ORG_PERSON_BASE ", new MapListHandler()); + queryRunner.update(desCon, "delete from MID_ORG_PERSON_BASE"); + for (Map row : rows) { + //只取部分单位的人员 + queryRunner.insert(desCon, "INSERT INTO MID_ORG_PERSON_BASE (ID, UPDATE_TIME, USED_NAME, AGE, GENDER, BIRTHDAY, ID_CARD, NATION, BIRTHPLACE, MARRIAGE, WORKING_TIME, EMAIL, TELPHONE, OFFICENUMBER, ADDRESS, DEGREE, POLITICS) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,?, ?, ?, ?)", new MapListHandler(), + row.get("ID"), new Timestamp(format.parse(String.valueOf(row.get("UPDATE_TIME"))).getTime()), row.get("USEDNAME"), row.get("AGE"), row.get("GENDER"), null, row.get("ID_CARD"), row.get("NATION"), row.get("BIRTHPLACE"), row.get("MARRIAGE"), row.get("WORKING_TIME"), row.get("EMAIL"), row.get("TELPHONE"), row.get("OFFICENUMBER"), row.get("ADDRESS"), row.get("DEGREE"), row.get("POLITICS")); + } + } + + void syncPersonPartMidDB(Connection srcCon, Connection desCon) throws Exception { + + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jybip/node/TongyongshukuanNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jybip/node/TongyongshukuanNode.java new file mode 100644 index 0000000..6713112 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jybip/node/TongyongshukuanNode.java @@ -0,0 +1,94 @@ +package com.seeyon.apps.jybip.node; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.ParamUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class TongyongshukuanNode extends ACommonSuperNode { + private static final Log log = Log.get(TongyongshukuanNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "tongyongshukuanNode"; + } + + @Override + public String getNodeName() { + return "OA通用收款同步BIP收款单超级节点"; + } + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getBipConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getBipConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + String summaryId = formDataVo.getColSummary().getId()+""; + try { + ParamUtil paramUtil = new ParamUtil(); + JSONObject jsonObject = paramUtil.getTongyongshoukuanParam(formDataVo,summaryId); + JSONObject headerer = HeaderUtil.getHeader(); + log.info(headerer.toString()); + String url = PropKit.getProp(PropKit.GENERALBILLURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject,url , headerer); + context.setResponse(res.toString()); + if(res.isEmpty()) { + log.info("BIP收款单创建失败,请联系管理员处理"); + context.back("BIP收款单创建失败,请联系管理员处理"); + }else { + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + log.info("推送BIP付款单成功"); + context.success(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", res.get("msg")); + }else { + log.info("推送BIP收款单失败:"+res.get("msg").toString()); + context.back(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果","推送BIP收款单失败:"+res.get("msg").toString()); + } + } + } catch (Exception e) { + log.error("异常:"+ e); + context.back("异常:"+ e); + e.printStackTrace(); + formDataVo.getNewFieldDataMap().put("BIP返回结果","推送BIP收款单失败:"+e); + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/A8FolderKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/A8FolderKit.java new file mode 100644 index 0000000..33c651b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/A8FolderKit.java @@ -0,0 +1,26 @@ +package com.seeyon.apps.jync_file.kit; + +import com.seeyon.ctp.common.SystemEnvironment; + +/** + * Description + *
获取A8产品下面的文件夹路径
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class A8FolderKit { + + private static String SH_PROP = ""; + + /** + * Description: + *
获取到A8的安装应用目录  seeyon
+ * @return + */ + public static String getPropFile() { + if("".equals(SH_PROP)) { + SH_PROP = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_nc_file/jyncfile.properties"; + } + return SH_PROP; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/DateKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/DateKit.java new file mode 100644 index 0000000..3794eb1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/DateKit.java @@ -0,0 +1,293 @@ +package com.seeyon.apps.jync_file.kit; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 日期处理工具类 + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class DateKit { + + private static SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd"); + + private static SimpleDateFormat sixFormat = new SimpleDateFormat("yyMMdd"); + + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private static SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); + + private static SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM"); + + private static SimpleDateFormat weekDay = new SimpleDateFormat("MM-dd"); + + private static SimpleDateFormat hour = new SimpleDateFormat("HH:mm"); + + private static SimpleDateFormat detailDate = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + + private static final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五","星期六" }; + + public static int getYear(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } + + public static String getSixDate() { + return getSixDate(null); + } + + public static String getSixDate(Date date) { + if(null == date) { + return sixFormat.format(new Date()); + } + return sixFormat.format(date); + } + + /** + * 获取这个时间属于一年的第几周 + * @param date + * @return + */ + public static int getWeekNum(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int week = cal.get(Calendar.WEEK_OF_YEAR); + // 如果是星期天,那么需要减1 + if("星期日".equals(DateKit.getDayWeekName(date))) { + week -= 1; + } + return week; + } + + /** + * Description: + * + *
+     * 获取一周
+     * 
+ * + * @param date + * @return + */ + public static void getWeekInterval(Map param) { + Calendar cal = Calendar.getInstance(); + // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 + if(1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + // 获得当前日期是一个星期的第几天 + int day = cal.get(Calendar.DAY_OF_WEEK); + // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 + cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); + param.put("startDate", cal.getTime()); + // System.out.println("所在周星期一的日期:" + imptimeBegin); + cal.add(Calendar.DATE, 6); + param.put("endDate", cal.getTime()); + // System.out.println("所在周星期日的日期:" + imptimeEnd); + } + + /** + * Description: + * + *
+     * 根据传入的日期,获取当前日期所在的一周时间段
+     * 
+ * + * @param date + * @return + */ + public static void getWeekInterval(Map param, Date now) { + Calendar cal = Calendar.getInstance(); + cal.setTime(now); + // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 + if(1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + // 获得当前日期是一个星期的第几天 + int day = cal.get(Calendar.DAY_OF_WEEK); + // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 + cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); + String time = DateKit.getDayDate(cal.getTime()) + " 00:00:00"; + try { + param.put("beginDate", DateKit.getdayDate(time)); + } catch(Exception e) { + // TODO + } + // System.out.println("所在周星期一的日期:" + imptimeBegin); + cal.add(Calendar.DATE, 6); + time = DateKit.getDayDate(cal.getTime()) + " 23:59:59"; + try { + param.put("endDate", DateKit.getdayDate(time)); + } catch(Exception e) { + // + } + // System.out.println("所在周星期日的日期:" + imptimeEnd); + } + + public static String getSimpleDate(Date date) { + if(date == null) { + return ""; + } + return simple.format(date); + } + + /** + * 给日志格式化使用 + * @param date + * @return + */ + public static String getDate4Cal(Date date) { + if(date == null) { + return ""; + } + return hour.format(date); + } + + public static String getDateString(Date date) { + if(date == null) { + return ""; + } + return sdf.format(date); + } + + public static String getDayDate(Date date) { + if(date == null) { + return ""; + } + return dayFormat.format(date); + } + + public static String getWeekDay(Date date) { + if(date == null) { + return ""; + } + return weekDay.format(date); + } + + /** + * Description: + * + *
+     * 获取多少天以后的日期
+     * 
+ * + * @param day + * @return + */ + public static Date getDayAfter(int day) { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, day); + return cal.getTime(); + } + // 获得某天的几天后 + public static Date getDayAfter(Date d, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.DATE, day); + return cal.getTime(); + } + + /** + * 获取一个月有多少天 + * @param year + * @param month + * @return + */ + public static int getDaysByYearMonth(int year, int month) { + Calendar a = Calendar.getInstance(); + a.set(Calendar.YEAR, year); + a.set(Calendar.MONTH, month); + a.set(Calendar.DATE, 1); + a.roll(Calendar.DATE, -1); + int maxDate = a.get(Calendar.DATE); + return maxDate; + } + + /** + * 获取今天是星期几 + * @param date + * @return + */ + public static String getDayWeekName(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; + if(dayOfWeek < 0) + dayOfWeek = 0; + return dayNames[dayOfWeek]; + } + + /** + * 解析时间,先解析yyyy-MM-dd HH:mm:ss + * @param dateStr + * @return + * @throws ParseException + * @throws Exception + */ + public static Date getdayDate(String dateStr) throws Exception { + try { + return sdf.parse(dateStr); + } catch(Exception e) { + try { + return detailDate.parse(dateStr); + } catch(Exception e1) { + try { + return dayFormat.parse(dateStr); + } catch(Exception e2) { + try { + return simple.parse(dateStr); + } + catch(Exception e3) { + return monthFormat.parse(dateStr); + } + } + } + } + } + + /** + * 根据时间获取周区间字符串 + * @param now + * @return 第XX周:2018-08-27至2018-09-02 + */ + public static String getWeekNumAndDateZone(Date now) { + StringBuffer sb = new StringBuffer(); + sb.append("第"); + sb.append(getWeekNum(now)); + sb.append("周:"); + Map param = new HashMap(); + getWeekInterval(param, now); + Date beginDate = (Date)param.get("beginDate"); + Date endDate = (Date)param.get("endDate"); + sb.append(dayFormat.format(beginDate)); + sb.append("至"); + sb.append(dayFormat.format(endDate)); + return sb.toString(); + } + + /** + * 根据日期和时间获取一个返回该日期该时间的date + * @param d 日期 + * @param time 时间 HH:mm格式 + * @return d日期+time时间 + * @throws ParseException + */ + public static Date getDateFromTime(Date d, String time) throws ParseException { + String dateTime = dayFormat.format(d) + " " + time; + return detailDate.parse(dateTime); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/PropKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/PropKit.java new file mode 100644 index 0000000..44d0d1b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/PropKit.java @@ -0,0 +1,92 @@ +package com.seeyon.apps.jync_file.kit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 读取参数 + */ + +public class PropKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + public static final String PROFILE = "profile"; + + public static final String PAYBILLFILEURL = "paybillFileUrl"; + public static final String GENERALBILLURL = "generalbillUrl"; + public static final String TRANSFORMURL = "transformUrl"; + public static final String XCFZCANCELURL = "xcfzCancelUrl"; + public static final String SBFZCANCELURL = "sbfzCancelUrl"; + public static final String OATOKENURL = "oaTokenUrl"; + public static final String DOWURL = "dowUrl"; + public static final String JYNCFILE = "jyncFile"; + public static final String RESTNAME = "restname"; + public static final String RESTPASSWORD = "restpassword"; + + public static final String PROD_PAYBILLFILEURL = "prod.paybillFileUrl"; + public static final String PROD_GENERALBILLURL = "prod.generalbillUrl"; + public static final String PROD_TRANSFORMURL = "prod.transformUrl"; + public static final String PROD_XCFZCANCELURL = "prod.xcfzCancelUrl"; + public static final String PROD_SBFZCANCELURL = "prod.sbfzCancelUrl"; + public static final String PROD_OATOKENURL = "prod.oaTokenUrl"; + public static final String PROD_DOWURL = "prod.dowUrl"; + public static final String PROD_JYNCFILE = "prod.jyncFile"; + public static final String PROD_RESTNAME = "prod.restname"; + public static final String PROD_RESTPASSWORD = "prod.restpassword"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(A8FolderKit.getPropFile()); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + String profile = prop.getProperty(PROFILE); + if("prod".equals(profile)) { + props.put(PAYBILLFILEURL, prop.getProperty(PROD_PAYBILLFILEURL)); + props.put(GENERALBILLURL, prop.getProperty(PROD_GENERALBILLURL)); + props.put(TRANSFORMURL, prop.getProperty(PROD_TRANSFORMURL)); + props.put(XCFZCANCELURL, prop.getProperty(PROD_XCFZCANCELURL)); + props.put(OATOKENURL, prop.getProperty(PROD_OATOKENURL)); + props.put(DOWURL, prop.getProperty(PROD_DOWURL)); + props.put(JYNCFILE, prop.getProperty(PROD_JYNCFILE)); + props.put(RESTNAME, prop.getProperty(PROD_RESTNAME)); + props.put(RESTPASSWORD, prop.getProperty(PROD_RESTPASSWORD)); + props.put(SBFZCANCELURL, prop.getProperty(PROD_SBFZCANCELURL)); + } else { + props.put(PAYBILLFILEURL, prop.getProperty(PROD_PAYBILLFILEURL)); + props.put(GENERALBILLURL, prop.getProperty(PROD_GENERALBILLURL)); + props.put(TRANSFORMURL, prop.getProperty(PROD_TRANSFORMURL)); + props.put(XCFZCANCELURL, prop.getProperty(PROD_XCFZCANCELURL)); + props.put(OATOKENURL, prop.getProperty(PROD_OATOKENURL)); + props.put(DOWURL, prop.getProperty(PROD_DOWURL)); + props.put(JYNCFILE, prop.getProperty(PROD_JYNCFILE)); + props.put(RESTNAME, prop.getProperty(PROD_RESTNAME)); + props.put(RESTPASSWORD, prop.getProperty(PROD_RESTPASSWORD)); + } + } + return props.get(key); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/StrKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/StrKit.java new file mode 100644 index 0000000..ca69d6d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/StrKit.java @@ -0,0 +1,251 @@ +package com.seeyon.apps.jync_file.kit; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 字符处理工具类 + * @date 2018年5月23日上午9:05:01 + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class StrKit { + + public static String str(Object o) { + if(o == null) { + return null; + } + if(o instanceof Date) { + return DateKit.getDayDate((Date)o); + } + if(o instanceof Timestamp) { + return DateKit.getDayDate((Timestamp)o); + } + if(o instanceof String) { + return (String)o; + } + return o.toString(); + } + + public static String str(Object o, boolean null2Str) { + if(o == null && null2Str) { + return ""; + } + return str(o); + } + + public static float toFloat(Object o) { + if(o == null) { + return 0f; + } else if(o instanceof Float) { + return (Float)o; + } else if(o instanceof String) { + return Float.valueOf((String)o); + } else if(o instanceof BigDecimal) { + return ((BigDecimal)o).floatValue(); + } + return 0f; + } + + public static Long toLong(Object o) { + if(null == o) { + return 0L; + } else if(o instanceof Long) { + return (Long)o; + } else if(o instanceof String) { + if("".equals(o)) { + return 0L; + } + return Long.valueOf((String)o); + } else if(o instanceof BigDecimal) { + return ((BigDecimal)o).longValue(); + } + return 0L; + } + + /** + * 取int值,为空返回0 + * @param obj 对象 + * @return + */ + public static Integer toInteger(Object obj) { + if(obj == null) { + return 0; + } else if(obj instanceof Long){ + return ((Long)obj).intValue(); + } else if(obj instanceof BigDecimal) { + return ((BigDecimal)obj).intValue(); + }else if(obj instanceof String) { + String o = (String) obj; + if("".equals(o)) { + return 0; + } else { + try { + return Integer.valueOf((String) obj); + } catch(Exception e) { + return 0; + } + } + } else if(obj instanceof Integer) { + return (Integer) obj; + } + return 0; + } + + public static Date toDate(Object o) throws Exception { + if(null == o) { + return null; + } else if(o instanceof Date) { + return (Date)o; + } else if(o instanceof Timestamp) { + return ((Timestamp) o); + } else if(o instanceof String){ + return DateKit.getdayDate((String) o); + } + return null; + } + + public static List toList(Object o) { + if(o == null) { + return null; + } else if(o instanceof List) { + return (List) o; + } else { + return null; + } + } + + /** + * 判断对象是否为空 + * @param o + * @return + */ + public static boolean isNull(Object o) { + if(null == o) { + return true; + } + if(o instanceof String) { + return "".equals((String) o); + } + if(o instanceof Collection) { + // 集合数量为0 则为空 + return ((Collection) o).size() == 0; + } + return false; + } + + /** + * 删除最后一个字符 + * @param input + * @return + */ + public static String deleteLastChar(String input) { + if(isNull(input)) + return ""; + return input.substring(0, input.length() - 1); + + } + + /** + * 转换成 123,456,789的格式 + * @param inputString + * @param length + * @return + */ + public static String getListStr(String inputString, int length) { + if(isNull(inputString)) + return ""; + String str = ""; + List strList = getStrList(inputString, length); + for(String string : strList) { + str += string + ","; + } + return deleteLastChar(str); + } + + /** + * 把原始字符串分割成指定长度的字符串列表 + * + * @param inputString + * 原始字符串 + * @param length + * 指定长度 + * @return + */ + public static List getStrList(String inputString, int length) { + int size = inputString.length() / length; + if (inputString.length() % length != 0) { + size += 1; + } + return getStrList(inputString, length, size); + } + + /** + * 把原始字符串分割成指定长度的字符串列表 + * + * @param inputString + * 原始字符串 + * @param length + * 指定长度 + * @param size + * 指定列表大小 + * @return + */ + private static List getStrList(String inputString, int length, + int size) { + List list = new ArrayList(); + for (int index = 0; index < size; index++) { + String childStr = substring(inputString, index * length, + (index + 1) * length); + list.add(childStr); + } + return list; + } + + /** + * 分割字符串,如果开始位置大于字符串长度,返回空 + * + * @param str + * 原始字符串 + * @param f + * 开始位置 + * @param t + * 结束位置 + * @return + */ + private static String substring(String str, int f, int t) { + if (f > str.length()) + return null; + if (t > str.length()) { + return str.substring(f, str.length()); + } else { + return str.substring(f, t); + } + } + + public static String getFixedLengthStr(String str, int length) { + // 如果为空,返回全部都是0 + if(length < 1) { + return ""; + } + if(isNull(str)) { + return getZeor(length); + } + if(str.length() < length) { + return getZeor(length - str.length()) + str; + } + return str.substring(0, length); + } + + private static String getZeor(int length) { + String str = ""; + for(int i = 0; i < length; i++) { + str += "0"; + } + return str; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/form/CAP4FormKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/form/CAP4FormKit.java new file mode 100644 index 0000000..2d97a31 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/kit/form/CAP4FormKit.java @@ -0,0 +1,206 @@ +package com.seeyon.apps.jync_file.kit.form; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.seeyon.apps.jync_file.kit.StrKit; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormDataBean; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.cap4.form.service.CAP4FormManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; + + +/** + * Description + *

+ * @author FanGaowei
+ * Date 2018年1月23日 上午11:22:28
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class CAP4FormKit { + + private static final Log LOGGER = CtpLogFactory.getLog(CAP4FormKit.class); + + public static FormBean getFormBean(CAP4FormManager cap4FormManager, String code) { + FormBean formBean = null; + try { + formBean = cap4FormManager.getFormByFormCode(code); + } catch(BusinessException e) { + LOGGER.error("获取表单发生异常,编号:" + code, e); + } + return formBean; + } + + /** + * 根据表单的显示名称获取字段的值 + * @param bean + * @param disPlay + * @return + */ + public static Object getFieldValue(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return bean.getFieldValue(field.getName()); + } + + + public static int getIntValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.toInteger(value); + } + + public static String getFieldStrValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.str(value, true); + } + + public static Object getFieldValueByName(FormDataBean bean, String fieldName) { + return bean.getFieldValue(fieldName); + } + + /** + * 根据表单的显示名称获取字段是 field000? + * @param bean + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getMasterTableBean(); + return getFieldTaleId(table, disPlay); + } + + /** + * 直接根据table来获取 + * @param table + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormTableBean table, String disPlay) { + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return field.getName(); + } + + public static String getFieldTaleId(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + return null; + } + return field.getName(); + } + + public static FormFieldBean getFieldBean(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(null == field) { + LOGGER.info("字段不存在:" + disPlay); + } + return field; + } + + + /** + * Description: + *

+	 * @param bean 这里的bean必须是getMasterBean() 方法获取到的bean
+	 * @param disPlay 
+	 * @param value
+	 */
+	public static void setCellValue(FormDataBean bean, String disPlay, Object value) {
+		FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+		if(cell != null) {
+			bean.addFieldValue(cell.getName(), value);
+		}
+	}
+	
+	public static void setCellValue(FormDataSubBean bean, String disPlay, Object value) {
+        FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+        if(cell != null) {
+            bean.addFieldValue(cell.getName(), value);
+        }
+    }
+	
+	/**
+	 * Description:
+	 * 
只适用于只有一个子表的表单
+ * @param colManager + * @param data + * @return + * @throws Exception + */ + public static List getSubBeans(FormDataMasterBean master) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + return subs.get(key); + } + return null; + } + + public static List getSubBeans(FormDataMasterBean master, String display) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + FormDataSubBean data = subs.get(key).get(0); + if(display.equals(data.getFormTable().getDisplay())) { + return subs.get(key); + } + } + LOGGER.info("表单不存在:" + display); + return null; + } + + /** + * Description: + *
获取从表字段
+ * @param sub + * @param disPlay + * @return + */ + public static Object getSubFieldValue(FormDataSubBean sub, String disPlay) { + return getFieldValue(sub, disPlay); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/node/TongYongFileNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/node/TongYongFileNode.java new file mode 100644 index 0000000..0ec4792 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/node/TongYongFileNode.java @@ -0,0 +1,216 @@ +package com.seeyon.apps.jync_file.node; + +import java.util.List; +import java.util.Map; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.InterfaceListUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; + +public class TongYongFileNode extends ACommonSuperNode { + + private static final Log log = Log.get(TongYongFileNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "tongYongFileNode"; + } + @Override + public String getNodeName() { + return "OA通用分账单推送附件BIP付款单超级节点"; + } + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManagery() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + log.info("开始处理单据TongYongFileNode"); + try { + FieldDataVo isVo = formDataVo.getFieldData("是否推送NC"); + if(isVo!=null){ + String is = ""; + is = isVo.getStringValue(); + if(!"1".equals(is)) { + context.success("不推送BIP付款单,跳过处理!"); + return context; + } + } + InterfaceListUtil interfaceListUtil = new InterfaceListUtil(); +// 获取OAtoken需要带入用户名请求 + String oatoken = interfaceListUtil.getToken("BIP2OA"); + log.info(oatoken); + FieldDataVo retVo = formDataVo.getFieldData("BIP返回结果"); + String ret = ""; + if(retVo!=null){ + ret = retVo.getStringValue(); + } + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + int row = 0; + StringBuffer stb = new StringBuffer(); + for(FormDataVo subFormDataVo:subFormMap) { + row++; + FieldDataVo isnumVo = subFormDataVo.getFieldData("附件是否上传"); + String isnum = ""; + if(isnumVo!=null){ + isnum = isnumVo.getStringValue(); + } + log.info(isnum); + FieldDataVo isFieldVo = subFormDataVo.getFieldData("相关附件明细"); + if(isFieldVo!=null && "0".equals(isnum)) { + FieldDataVo isqushidVo = subFormDataVo.getFieldData("是否批量对私"); + String isqushid = ""; + if(isqushidVo!=null) { + isqushid = isqushidVo.getDbValue().toString(); + } + String isqush = ""; + if("".equals(isqushid)) { + isqush = "是"; + }else { + isqush = getEnumManagerNew().getEnumItem(Long.parseLong(isqushid)).getLabel(); + } + if("是".equals(isqush)) { + FieldDataVo subReferenceVo = subFormDataVo.getFieldData("相关附件明细"); + String subReference = ""; + if(subReferenceVo!=null){ + subReference = subReferenceVo.getDbValue().toString(); + } +// 获取表单中附件的相关信息 + List attachmentIds = attachmentManager.getBySubReference(Long.parseLong(subReference)); + JSONArray jsonArray = new JSONArray(); + for (int i = 0 ; i < attachmentIds.size();i++) { + Attachment attachment = attachmentManager.getAttachmentByFileURL(attachmentIds.get(i)); + Long fileUrl = attachment.getFileUrl(); + String filename = attachment.getFilename(); + log.info(filename); + String fileType = filename.substring(filename.lastIndexOf(".")+1); + String oaFileName = filename.substring(0,filename.lastIndexOf(".")); +// 调用接口下载文件,文件存放在指定的路径下 + String dowUrl = PropKit.getProp(PropKit.DOWURL)+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + log.info(dowUrl); + String str = SystemEnvironment.getApplicationFolder(); + String dowPath = str+"/jyncfile/"+filename; + context.setUrl(dowUrl); + context.setRequest(dowPath); + String download = interfaceListUtil.download(dowUrl, dowPath); + context.setResponse(download); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", oaFileName); + jsonObject.put("type", fileType); + jsonObject.put("url", PropKit.getProp(PropKit.JYNCFILE)+"/"+filename); + jsonArray.add(jsonObject); + log.info(jsonObject.toString()); + } +// 封装推送接口参数调用接口 + JSONObject headerer = HeaderUtil.getHeader(); + log.info("headerer:"+headerer); + JSONObject jsonObject = new JSONObject(); + FieldDataVo billnoVo = subFormDataVo.getFieldData("分账单据流水号"); + String billno = ""; + if(billnoVo!=null){ + billno = billnoVo.getStringValue(); + } + jsonObject.put("billno", billno); + jsonObject.put("code", "FJ01"); + jsonObject.put("fileList", jsonArray); + System.out.println(jsonObject); + JSONObject res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.PAYBILLFILEURL), headerer); + String isStatus = res.get("status").toString(); + if("1".equals(isStatus)) { + stb.append(";\n第"+row+"行推送BIP付款结算单附件成功"); + System.out.println("第"+row+"行推送BIP付款结算单附件成功"); + log.info("第"+row+"行推送BIP付款结算单附件成功"); + formDataVo.getNewFieldDataMap().put("附件是否上传", "1"); + context.success("第"+row+"行推送BIP付款结算单附件成功"); + }else { + String msg = res.get("msg").toString(); + log.info(msg); + context.back(msg); + context.setErrMsg(msg); + log.info("第"+row+"行数据推送BIP付款结算单附件失败,"+res.get("msg").toString()); + stb.append(";\n第"+row+"行推送BIP付款结算单附件失败,"+res.get("msg").toString()); + break; + } + } + } + } + String[] rets = ret.split(";"); + String r = ""; + if(rets.length>1) { + rets[rets.length-1] = stb.toString().substring(1,stb.length()); + r = StringUtils.join(rets, ";"); + }else { + r = rets[0]+stb.toString(); + } + formDataVo.getNewFieldDataMap().put("BIP返回结果", r); + } catch (Exception e) { + log.error("异常:"+ e); + e.printStackTrace(); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + } + + return context; + } +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/node/XinChouFileNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/node/XinChouFileNode.java new file mode 100644 index 0000000..f4b155b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/node/XinChouFileNode.java @@ -0,0 +1,212 @@ +package com.seeyon.apps.jync_file.node; + +import java.util.List; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.InterfaceListUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.v3x.services.form.FormFactory; + +public class XinChouFileNode extends ACommonSuperNode { + + private static final Log log = Log.get(XinChouFileNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "xinChouFileNode"; + } + @Override + public String getNodeName() { + return "OA薪酬分账单推送附件BIP付款单超级节点"; + } + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + private FormFactory formFactory; + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManagery() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + System.out.println("开始处理单据XinChouFileNode"); + try { + InterfaceListUtil interfaceListUtil = new InterfaceListUtil(); +// 获取OAtoken需要带入用户名请求 + String oatoken = interfaceListUtil.getToken("BIP2OA"); + log.info("token:"+oatoken); + FieldDataVo retVo = formDataVo.getFieldData("BIP返回结果"); + String ret = ""; + if(retVo!= null){ + ret = retVo.getStringValue(); + } + List subFormMap = formDataVo.getSubFormMap().get("分账明细表"); + int row = 0; + StringBuffer stb = new StringBuffer(); + for(FormDataVo subFormDataVo:subFormMap) { + row++; + FieldDataVo isnumVo = subFormDataVo.getFieldData("附件是否上传"); + String isnum = ""; + if(isnumVo!=null){ + isnum = isnumVo.getStringValue(); + } + FieldDataVo isFileVo = subFormDataVo.getFieldData("相关附件明细"); + if(isFileVo!=null && "0".equals(isnum)) { + String isqushid = ""; + FieldDataVo isqushidVo = subFormDataVo.getFieldData("分账是否薪资代发"); + if(isqushidVo!=null) { + isqushid = isqushidVo.getStringValue(); + } + String isqush = ""; + if("".equals(isqushid)) { + isqush = "是"; + }else { + isqush = getEnumManagerNew().getEnumItem(Long.parseLong(isqushid)).getLabel(); + } + if("是".equals(isqush)) { + FieldDataVo subReferenceVo = subFormDataVo.getFieldData("相关附件明细"); + String subReference = ""; + if(subReferenceVo != null){ + subReference = subReferenceVo.getDbValue().toString(); + } +// 获取表单中附件的相关信息 + List attachmentIds = attachmentManager.getBySubReference(Long.parseLong(subReference)); + JSONArray jsonArray = new JSONArray(); + for (int i = 0 ; i < attachmentIds.size();i++) { + Attachment attachment = attachmentManager.getAttachmentByFileURL(attachmentIds.get(i)); + Long fileUrl = attachment.getFileUrl(); + String filename = attachment.getFilename(); +// String[] fileType = filename.split("\\."); + String fileType = filename.substring(filename.lastIndexOf(".")+1); + String oaFileName = filename.substring(0,filename.lastIndexOf(".")); + log.info(oaFileName); +// 调用接口下载文件,文件存放在指定的路径下 + String dowUrl = PropKit.getProp(PropKit.DOWURL)+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + String str = SystemEnvironment.getApplicationFolder(); + String dowPath = str+"/jyncfile/"+filename; + context.setUrl(dowUrl); + context.setRequest(dowPath); + String download = interfaceListUtil.download(dowUrl, dowPath); + context.setResponse(download); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", oaFileName); + jsonObject.put("type", fileType); + jsonObject.put("url", PropKit.getProp(PropKit.JYNCFILE)+"/"+filename); + jsonArray.add(jsonObject); + log.info(jsonObject.toString()); + } +// 封装推送接口参数调用接口 + JSONObject headerer = HeaderUtil.getHeader(); + log.info("headerer:"+headerer); + JSONObject jsonObject = new JSONObject(); + FieldDataVo billnoVo = subFormDataVo.getFieldData("分账单据流水号"); + String billno= ""; + if(billnoVo!=null){ + billno = billnoVo.getStringValue(); + } + jsonObject.put("billno", billno); + jsonObject.put("code", "FJ01"); + jsonObject.put("fileList", jsonArray); + System.out.println(jsonObject); + JSONObject res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.PAYBILLFILEURL), headerer); + String isStatus = res.get("status").toString(); + if("1".equals(isStatus)) { + stb.append(";\n第"+row+"行推送BIP付款结算单附件成功"); + System.out.println("第"+row+"行推送BIP付款结算单附件成功"); + log.info("第"+row+"行推送BIP付款结算单附件成功"); + formDataVo.getNewFieldDataMap().put("附件是否上传","1"); + context.success("第"+row+"行推送BIP付款结算单附件成功"); + }else { + String msg = res.get("msg").toString(); + System.out.println(msg); + context.back(msg); + context.setErrMsg(msg); + log.info("第"+row+"行数据推送BIP付款结算单附件失败,"+res.get("msg").toString()); + stb.append(";\n第"+row+"行推送BIP付款结算单附件失败,"+res.get("msg").toString()); + break; + } + } + } + } + String[] rets = ret.split(";"); + String r = ""; + if(rets.length>1) { + rets[rets.length-1] = stb.toString().substring(1,stb.length()); + r = StringUtils.join(rets, ";"); + }else { + r = rets[0]+stb.toString(); + } + formDataVo.getNewFieldDataMap().put("BIP返回结果", r); + } catch (Exception e) { + log.error("异常:"+ e); + e.printStackTrace(); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + } + return context; + } + +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/HeaderUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/HeaderUtil.java new file mode 100644 index 0000000..9dfb6e2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/HeaderUtil.java @@ -0,0 +1,27 @@ +package com.seeyon.apps.jync_file.util; + +import java.io.UnsupportedEncodingException; +import java.util.Base64; +import java.util.Date; + +import org.apache.commons.codec.digest.DigestUtils; + +import com.alibaba.fastjson.JSONObject; + +public class HeaderUtil { + + public static JSONObject getHeader() throws UnsupportedEncodingException{ + JSONObject headerer = new JSONObject(); + headerer.put("Content-Type", "application/json;charset=utf-8"); + Date date = new Date(); + String ts = date.getTime()+""; + headerer.put("ts", ts); + headerer.put("client_id", "OA"); + headerer.put("client_security", "30dcf9a3cfef4b98a157e926db6369f0"); + String p=ts+"30dcf9a3cfef4b98a157e926db6369f0"; + byte[] bytes = DigestUtils.md5(p.getBytes("UTF-8")); // md5 + String signature= Base64.getEncoder().encodeToString(bytes); //base64 + headerer.put("signature", signature); + return headerer; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/InterfaceListUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/InterfaceListUtil.java new file mode 100644 index 0000000..8fb958a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/InterfaceListUtil.java @@ -0,0 +1,348 @@ +package com.seeyon.apps.jync_file.util; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import org.springframework.core.io.support.PropertiesLoaderUtils; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.jync_file.kit.PropKit; + +/** + * 接口调用工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ +public class InterfaceListUtil { + + /** + * 获取一个token + * + * @param restUserName rest用户名 + * @param restPassword rest密码 + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public String getToken(String loginName) throws FileNotFoundException, IOException { + String address = ""; + String token = ""; + if("".equals(loginName)) { + address = PropKit.getProp(PropKit.OATOKENURL)+"/"+PropKit.getProp(PropKit.RESTNAME)+"/"+PropKit.getProp(PropKit.RESTPASSWORD); + }else { + address = PropKit.getProp(PropKit.OATOKENURL)+"/"+PropKit.getProp(PropKit.RESTNAME)+"/"+PropKit.getProp(PropKit.RESTPASSWORD)+"?loginName="+loginName; + } + HttpURLConnection connection = (HttpURLConnection) new URL(address).openConnection(); + connection.setRequestMethod("GET"); + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + String result = response.toString(); + if(result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + System.out.println(jsObj); + token = jsObj.get("id").toString(); + }else { + token = result; + } + System.out.println(token); + } else { + System.out.println("GET request not worked"); + } + return token; + } + + /** + * 调用get接口 + * + * @param par 拼接在url中的参数 + * @param strUrl 需要调用的url对应的配置文件的key + * @return + */ + public String doGet(String par, String strUrl, String token) { + String address = MessageFormat.format(getProperties(strUrl), par + "?token=") + token; + + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(address); + try { + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } +// JSONObject jsObj = JSONObject.parseObject(result); + return result; + + } + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public JSONObject doPost(String str, String urlStr,String token) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { +// String token = getToken(getProperties("restUserName"), getProperties("restPassword")); + URL url = new URL(getProperties(urlStr) + "?token=" + token); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", "application/json"); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + + } + + /** + * 获取指定参数文件的值(pa.properties) + * + * @param str 参数文件中的key + * @return + */ + public String getProperties(String str) { + Properties properties = null; + try { + properties = PropertiesLoaderUtils.loadAllProperties("pa.properties"); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return (String) properties.get(str); + } + + /** + * 调用Soap接口 对接平台使用 + * @param action 平台接口中的方法参数名称 + * @param xml 传递平台的XML数据参数 + * @return 返回调取soap接口后接口的返回值(未处理) + * @throws HttpException + * @throws IOException + */ + public String doSoap(String action, String xml,String id) throws HttpException, IOException { + String wsdl = ""; + if("createDepartment".equals(action)||"updateDepartment".equals(action)) { + wsdl = getProperties("DeptWsdl"); + }else if("createPractitioner".equals(action)||"updatePractitioner".equals(action)) { + wsdl = getProperties("MemberWsdl"); + } + System.out.println("wsdl:"+wsdl); + int timeout = 10000; + + // 构造soap请求信息 + StringBuffer sb = new StringBuffer(""); + sb.append( + ""); + sb.append(""); + sb.append(""); + sb.append(" "); + sb.append("" + action + "" + xml + ""); + sb.append(""); + sb.append(""); + sb.append(""); + + // HttpClient发送SOAP请求 +// System.out.println("HttpClient 发送SOAP请求"); + HttpClient client = new HttpClient(); + PostMethod postMethod = new PostMethod(wsdl); + Header header = new Header(); + // 设置连接超时 + client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout); + // 设置读取时间超时 + client.getHttpConnectionManager().getParams().setSoTimeout(timeout); + // 然后把Soap请求数据添加到PostMethod中 + RequestEntity requestEntity = null; + try { + requestEntity = new StringRequestEntity(sb.toString(), "text/xml", "UTF-8"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // 设置请求头部,否则可能会报 “no SOAPAction header” 的错误 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date businessTime = new Date(); + Date operationTime = new Date(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmss"); + Date root = new Date(); + String rootId = sdf1.format(root); + postMethod.setRequestHeader("SOAPAction", ""); + postMethod.setRequestHeader("Content-Type", "application/fhir+json"); + postMethod.setRequestHeader("rootId", rootId); + postMethod.setRequestHeader("token", id); + postMethod.setRequestHeader("domain", "OA"); + postMethod.setRequestHeader("businessTime", sdf.format(businessTime)); + postMethod.setRequestHeader("key", "806c1571-35de-41a2-b3c9-06ae5474d43a"); + postMethod.setRequestHeader("operationTime", sdf.format(operationTime)); + // 设置请求体 + postMethod.setRequestEntity(requestEntity); + int status = client.executeMethod(postMethod); + // 打印请求状态码 +// System.out.println("status:" + status); + // 获取响应体输入流 + InputStream is = postMethod.getResponseBodyAsStream(); + // 获取请求结果字符串 + byte[] bytes = new byte[is.available()]; + is.read(bytes); + String result = new String(bytes); + + return result; + } + + /** + * 下载文件到指定目录 + * @param dowUrl:http地址 + * @param dowPath:指定目录 + * */ + public String download(String dowUrl, String dowPath){ + try { +// log.info("下载地址是:"+dowUrl+",存储地址是:"+dowPath); + URL url = new URL(dowUrl); + + URLConnection urlConnection = url.openConnection(); + + HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;// http的连接类 + + //String contentType = httpURLConnection.getContentType();//请求类型,可用来过滤请求, + + httpURLConnection.setConnectTimeout(1000*5);//设置超时 + + httpURLConnection.setRequestMethod("GET");//设置请求方式,默认是GET + + httpURLConnection.setRequestProperty("Charset", "UTF-8");// 设置字符编码 + + httpURLConnection.connect();// 打开连接 + + BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream()); + + String path = dowPath;// 指定存放位置 + File filed = new File(path); + + OutputStream out = new FileOutputStream(filed); + int size = 0; + + byte[] b = new byte[2048]; + //把输入流的文件读取到字节数据b中,然后输出到指定目录的文件 + while ((size = bin.read(b)) != -1) { + out.write(b, 0, size); + } + // 关闭资源 + bin.close(); + out.close(); + return "200"; + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return "500"; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return "400"; + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/ParamUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/ParamUtil.java new file mode 100644 index 0000000..46f900a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/ParamUtil.java @@ -0,0 +1,876 @@ +package com.seeyon.apps.jync_file.util; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import cn.hutool.log.Log; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.jync_file.kit.form.CAP4FormKit; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.v3x.dee.util.DateUtil; + +public class ParamUtil { + + private static final Log log = Log.get(ParamUtil.class); + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + /** + * 薪酬分账参数封装 + * @param formDataVo + * @param summaryId + * @return + * @throws IOException + */ + public JSONObject getXinChouFenZhangParam(FormDataVo formDataVo,String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + List istrue = new ArrayList(); + FieldDataVo isbearidVo = formDataVo.getFieldData("支付公司是否成本承担公司"); + String isbearid = ""; + if(isbearidVo!=null){ + isbearid = isbearidVo.getDbValue().toString(); + } + + String isbear = ""; + if("".equals(isbearid)){ + isbear = "否"; + }else { + isbear = getEnumManagerNew().getEnumItem(Long.parseLong(isbearid)).getLabel(); + } + for (FormDataVo subFormDataVo : subFormMap) { + FieldDataVo bipNoVo = subFormDataVo.getFieldData("BIP单据号"); + String bipNo = ""; + if(bipNoVo!=null){ + bipNo = bipNoVo.getStringValue(); + istrue.add(bipNo); + } + JSONObject subjson = new JSONObject(); + FieldDataVo psndoccodeVo = subFormDataVo.getFieldData("分账收款人编码"); + String psndoccode = ""; + if(psndoccodeVo!=null){ + psndoccode = psndoccodeVo.getStringValue(); + } + subjson.put("psndoccode", psndoccode); + FieldDataVo businessdateVo = formDataVo.getFieldData("单据日期"); + String businessdate = ""; + if(businessdateVo!=null){ + businessdate = businessdateVo.getStringValue(); + } + subjson.put("businessdate", businessdate); + JSONArray data = new JSONArray(); + JSONObject jsondata = new JSONObject(); + FieldDataVo scommentVo = formDataVo.getFieldData("摘要内容"); + String scomment = ""; + if(scommentVo!=null){ + scomment = scommentVo.getStringValue(); + } + jsondata.put("scomment", scomment); + FieldDataVo field0120Vo = subFormDataVo.getFieldData("摘要内容"); + String field0120 = ""; + if(field0120Vo!=null){ + field0120 = field0120Vo.getStringValue(); + } + jsondata.put("field0120", field0120); + FieldDataVo field0121Vo = subFormDataVo.getFieldData("分账税额"); + String field0121 = ""; + if(field0121Vo!=null){ + field0121 = field0121Vo.getStringValue(); + } + jsondata.put("field0121", field0121); + FieldDataVo field0119Vo = subFormDataVo.getFieldData("分账行无税金额"); + String field0119 = ""; + if(field0119Vo!=null){ + field0119 = field0119Vo.getStringValue(); + } + jsondata.put("field0119", field0119); + FieldDataVo moneyVo = subFormDataVo.getFieldData("分账原币金额"); + String money = ""; + if(moneyVo!=null){ + money = moneyVo.getStringValue(); + } + jsondata.put("money", money); + FieldDataVo jsfsVo = formDataVo.getFieldData("结算方式编号"); + String jsfs = ""; + if(jsfsVo!=null){ + jsfs = jsfsVo.getStringValue(); + } + jsondata.put("jsfs", jsfs); + FieldDataVo kmdlVo = formDataVo.getFieldData("科目大类编号"); + String kmdl = ""; + if(kmdlVo!=null){ + kmdl = kmdlVo.getStringValue(); + } + jsondata.put("kmdl", kmdl); + FieldDataVo szxmVo = formDataVo.getFieldData("收支项目编号"); + String szxm = ""; + if(szxmVo!=null){ + szxm = szxmVo.getStringValue(); + } + jsondata.put("szxm",szxm); + jsondata.put("fkyw", "OA"); + data.add(jsondata); + subjson.put("data", data); + if("是".equals(isbear)) { + FieldDataVo orgcodeVo = subFormDataVo.getFieldData("分账组织编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode",orgcode); + FieldDataVo fkbankcodeVo = subFormDataVo.getFieldData("分账付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode", fkbankcode); + }else { + FieldDataVo orgcodeVo = formDataVo.getFieldData("主表支付公司编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode", orgcode); + FieldDataVo fkbankcodeVo = formDataVo.getFieldData("付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode",fkbankcode); + } + FieldDataVo skbankcodeVo = subFormDataVo.getFieldData("分账收款银行账号"); + String skbankcode = ""; + if(skbankcodeVo!=null){ + skbankcode = skbankcodeVo.getStringValue(); + } + subjson.put("skbankcode", skbankcode); + subjson.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId); + FieldDataVo oabillcodeVo = subFormDataVo.getFieldData("分账单据流水号"); + String oabillcode = ""; + if(oabillcodeVo!=null){ + oabillcode = oabillcodeVo.getStringValue(); + } + subjson.put("oabillcode", oabillcode); + FieldDataVo field0006Vo = formDataVo.getFieldData("原始单据数"); + String field0006 = ""; + if(field0006Vo!=null){ + field0006 = field0006Vo.getStringValue(); + } + subjson.put("field0006", field0006); + FieldDataVo suppliercodeVo = subFormDataVo.getFieldData("分账收款人编码"); + String suppliercode = ""; + if(suppliercodeVo!=null){ + suppliercode = suppliercodeVo.getStringValue(); + } + subjson.put("suppliercode", suppliercode); + FieldDataVo ytVo = formDataVo.getFieldData("摘要内容"); + String yt = ""; + if(ytVo!=null){ + yt = ytVo.getStringValue(); + } + subjson.put("yt", yt); + FieldDataVo busitypecodeIdVo = formDataVo.getFieldData("业务流程"); + String busitypecodeId = ""; + if(busitypecodeIdVo!=null){ + busitypecodeId = busitypecodeIdVo.getDbValue().toString(); + } + String busitypecodeCode = getEnumManagerNew().getEnumItem(Long.parseLong(busitypecodeId)).getEnumItemCode(); + String busitypecode = busitypecodeCode.substring(5); + subjson.put("busitypecode", busitypecode); + FieldDataVo wldxidVo = subFormDataVo.getFieldData("业务流程"); + String wldxid = ""; + if(wldxidVo!=null){ + wldxid = wldxidVo.getDbValue().toString(); + } + String wldxCode = getEnumManagerNew().getEnumItem(Long.parseLong(wldxid)).getEnumItemCode(); + String wldxvalue = wldxCode.substring(5); + subjson.put("wldx", wldxvalue); + subjson.put("fklx", "D3"); + jsonArray.add(subjson); + } + jsonObject.put("data", jsonArray); + System.out.println(istrue.size()==subFormMap.size()); + if(istrue.size()==subFormMap.size()) { + jsonObject = new JSONObject(); + } + return jsonObject; + } + + /** + * 通用分账参数封装-新 + * @param formDataVo + * @param summaryId + * @return + * @throws IOException + */ + public JSONObject getTongYongFenZhangParam(FormDataVo formDataVo,String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + + FieldDataVo isbearidVo = formDataVo.getFieldData("支付公司是否成本承担公司"); + String isbearid = ""; + if(isbearidVo!=null){ + isbearid = isbearidVo.getStringValue(); + } + String isbear = ""; + if("".equals(isbearid)){ + isbear = "否"; + }else { + isbear = getEnumManagerNew().getEnumItem(Long.parseLong(isbearid)).getLabel(); + } + for (FormDataVo subFormDataVo : subFormMap) { + FieldDataVo numVo = subFormDataVo.getFieldData("分账原币金额"); + String num = ""; + if(numVo!=null){ + num = numVo.getStringValue(); + } + if("0".equals(num)) { + FieldDataVo fieldDataVo = subFormDataVo.getFieldData("分账收款人编码"); + log.info("分账原币金额为0,跳过处理:"+ fieldDataVo.getStringValue()); + continue; + } + JSONObject subjson = new JSONObject(); + FieldDataVo psndoccodeVo = subFormDataVo.getFieldData("分账收款人编码"); + String psndoccode = ""; + if(psndoccodeVo!=null){ + psndoccode = psndoccodeVo.getStringValue(); + } + subjson.put("psndoccode", psndoccode); + FieldDataVo businessdateVo = formDataVo.getFieldData("单据日期"); + String businessdate = ""; + if(businessdateVo!=null){ + businessdate = businessdateVo.getStringValue(); + } + subjson.put("businessdate", businessdate); + JSONArray data = new JSONArray(); + JSONObject jsondata = new JSONObject(); + FieldDataVo scommentVo = formDataVo.getFieldData("摘要内容"); + String scomment = ""; + if(scommentVo!=null){ + scomment = scommentVo.getStringValue(); + } + jsondata.put("scomment", scomment); + FieldDataVo field0120Vo = subFormDataVo.getFieldData("分账税率"); + String field0120 = ""; + if(field0120Vo!=null){ + field0120 = field0120Vo.getStringValue(); + } + jsondata.put("field0120", field0120); + FieldDataVo field0121Vo = subFormDataVo.getFieldData("分账税额"); + String field0121 = ""; + if(field0121Vo!=null){ + field0121 = field0121Vo.getStringValue(); + } + jsondata.put("field0121", field0121); + FieldDataVo field0119Vo = subFormDataVo.getFieldData("分账行无税金额"); + String field0119 = ""; + if(field0119Vo!=null){ + field0119 = field0119Vo.getStringValue(); + } + jsondata.put("field0119", field0119); + FieldDataVo moneyVo = subFormDataVo.getFieldData("分账原币金额"); + String money = ""; + if(moneyVo!=null){ + money = moneyVo.getStringValue(); + } + jsondata.put("money", money); + FieldDataVo jsfsVo = formDataVo.getFieldData("结算方式编号"); + String jsfs = ""; + if(jsfsVo!=null){ + jsfs = jsfsVo.getStringValue(); + } + jsondata.put("jsfs",jsfs); + FieldDataVo kmdlVo = formDataVo.getFieldData("科目大类编号"); + String kmdl = ""; + if(kmdlVo!=null){ + kmdl = kmdlVo.getStringValue(); + } + jsondata.put("kmdl", kmdl); + FieldDataVo szxmVo = formDataVo.getFieldData("收支项目编号"); + String szxm = ""; + if(szxmVo!=null){ + szxm = szxmVo.getStringValue(); + } + jsondata.put("szxm", szxm); + jsondata.put("fkyw", "OA"); + data.add(jsondata); + subjson.put("data", data); + if("是".equals(isbear)) { + FieldDataVo orgcodeVo = subFormDataVo.getFieldData("分账组织编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode",orgcode); + FieldDataVo fkbankcodeVo = subFormDataVo.getFieldData("分账付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode", fkbankcode); + }else { + FieldDataVo orgcodeVo = formDataVo.getFieldData("主表支付公司编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode", orgcode); + FieldDataVo fkbankcodeVo = formDataVo.getFieldData("付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode", fkbankcode); + } + FieldDataVo skbankcodeVo = subFormDataVo.getFieldData("分账收款银行账号"); + String skbankcode = ""; + if(skbankcodeVo!=null){ + skbankcode = skbankcodeVo.getStringValue(); + } + subjson.put("skbankcode", skbankcode); + subjson.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId); + FieldDataVo oabillcodeVo = subFormDataVo.getFieldData("分账单据流水号"); + String oabillcode = ""; + if(oabillcodeVo!=null){ + oabillcode = oabillcodeVo.getStringValue(); + } + subjson.put("oabillcode", oabillcode); + FieldDataVo field0006Vo = formDataVo.getFieldData("分账单据流水号"); + String field0006 = ""; + if(field0006Vo!=null){ + field0006 = field0006Vo.getStringValue(); + } + subjson.put("field0006", field0006); + FieldDataVo suppliercodeVo = subFormDataVo.getFieldData("分账单据流水号"); + String suppliercode = ""; + if(suppliercodeVo!=null){ + suppliercode = suppliercodeVo.getStringValue(); + } + subjson.put("suppliercode", suppliercode); + FieldDataVo ytVo = formDataVo.getFieldData("分账单据流水号"); + String yt = ""; + if(ytVo!=null){ + yt = ytVo.getStringValue(); + } + subjson.put("yt", yt); + FieldDataVo busitypecodeIdVo = formDataVo.getFieldData("业务流程"); + String busitypecodeId = ""; + if(ytVo!=null){ + busitypecodeId = busitypecodeIdVo.getDbValue().toString(); + } + String busitypecodeCode = getEnumManagerNew().getEnumItem(Long.parseLong(busitypecodeId)).getEnumItemCode(); + String busitypecode = busitypecodeCode.substring(5); + subjson.put("busitypecode", busitypecode); + FieldDataVo wldxidVo = subFormDataVo.getFieldData("往来对象"); + String wldxid = ""; + if(wldxidVo!=null) { + wldxid = wldxidVo.getDbValue().toString(); + } + String wldxCode = getEnumManagerNew().getEnumItem(Long.parseLong(wldxid)).getEnumItemCode(); + String wldxvalue = wldxCode.substring(5); + subjson.put("wldx", wldxvalue); + subjson.put("fklx", "D3"); + jsonArray.add(subjson); + } + jsonObject.put("data", jsonArray); + return jsonObject; + } + + + + /** + * 社保分账参数封装 + * @param formDataVo + * @param summaryId + * @return + * @throws IOException + */ + public JSONObject getSheBaoFenZhangParam( FormDataVo formDataVo,String summaryId) throws IOException, NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + List istrue = new ArrayList(); + FieldDataVo isbearidVo = formDataVo.getFieldData("支付公司是否成本承担公司"); + String isbearid = ""; + if(isbearidVo!=null){ + isbearid = isbearidVo.getDbValue().toString(); + } + String isbear = ""; + if("".equals(isbearid)){ + isbear = "否"; + }else { + isbear = getEnumManagerNew().getEnumItem(Long.parseLong(isbearid)).getLabel(); + } + FieldDataVo isunitidVo = formDataVo.getFieldData("是否同一收款单位"); + String isunitid = ""; + if(isunitidVo!=null){ + isunitid = isunitidVo.getDbValue().toString(); + } + String isunit = ""; + if("".equals(isunitid)){ + isunit = "是"; + }else { + isunit = getEnumManagerNew().getEnumItem(Long.parseLong(isunitid)).getLabel(); + } + if("是".equals(isunit) && "否".equals(isbear)) { + JSONObject subjson = new JSONObject(); + FieldDataVo psndoccodeVo = formDataVo.getFieldData("收款单位编码"); + String psndoccode = ""; + if(psndoccodeVo!=null){ + psndoccode = psndoccodeVo.getStringValue(); + } + subjson.put("psndoccode", psndoccode); + FieldDataVo businessdateVo = formDataVo.getFieldData("单据日期"); + String businessdate = ""; + if(businessdateVo!=null){ + businessdate = businessdateVo.getStringValue(); + } + subjson.put("businessdate", businessdate); + JSONArray data = new JSONArray(); + JSONObject jsondata = new JSONObject(); + FieldDataVo scommentVo = formDataVo.getFieldData("摘要内容"); + String scomment = ""; + if(scommentVo!=null){ + scomment = scommentVo.getStringValue(); + } + jsondata.put("scomment", scomment); + jsondata.put("field0120", "0"); + jsondata.put("field0121", "0"); + FieldDataVo moneyVo = formDataVo.getFieldData("合计分账支付"); + String money = ""; + if(moneyVo!=null){ + money = moneyVo.getStringValue(); + } + jsondata.put("money", money); + FieldDataVo jsfsVo = formDataVo.getFieldData("结算方式编号"); + String jsfs = ""; + if(jsfsVo!=null){ + jsfs = jsfsVo.getStringValue(); + } + jsondata.put("jsfs", jsfs); + FieldDataVo kmdlVo = formDataVo.getFieldData("科目大类编号"); + String kmdl = ""; + if(kmdlVo!=null){ + kmdl = kmdlVo.getStringValue(); + } + jsondata.put("kmdl", kmdl); + FieldDataVo szxmVo = formDataVo.getFieldData("收支项目编号"); + String szxm = ""; + if(szxmVo!=null){ + szxm = szxmVo.getStringValue(); + } + jsondata.put("szxm", szxm); + jsondata.put("field0119","0"); + jsondata.put("fkyw", "OA"); + data.add(jsondata); + subjson.put("data", data); + jsondata.put("szxm", szxm); + FieldDataVo orgcodeVo = formDataVo.getFieldData("主表支付公司编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode", orgcode); + FieldDataVo fkbankcodeVo = formDataVo.getFieldData("付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode", fkbankcode); + FieldDataVo skbankcodeVo = formDataVo.getFieldData("收款银行账号"); + String skbankcode = ""; + if(skbankcodeVo!=null){ + skbankcode = skbankcodeVo.getStringValue(); + } + subjson.put("skbankcode", skbankcode); + subjson.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId); + FieldDataVo oabillcodeVo = formDataVo.getFieldData("单据流水号"); + String oabillcode = ""; + if(oabillcodeVo!=null){ + oabillcode = oabillcodeVo.getStringValue(); + } + subjson.put("oabillcode",oabillcode); + FieldDataVo field0006Vo = formDataVo.getFieldData("原始单据数"); + String field0006 = ""; + if(field0006Vo!=null){ + field0006 = field0006Vo.getStringValue(); + } + subjson.put("field0006", field0006); + FieldDataVo suppliercodeVo = formDataVo.getFieldData("原始单据数"); + String suppliercode = ""; + if(suppliercodeVo!=null){ + suppliercode = suppliercodeVo.getStringValue(); + } + subjson.put("suppliercode", suppliercode); + FieldDataVo ytVo = formDataVo.getFieldData("摘要内容"); + String yt = ""; + if(ytVo!=null){ + yt = ytVo.getStringValue(); + } + subjson.put("yt", yt); + + FieldDataVo wldxidVo = formDataVo.getFieldData("表头往来对象"); + String wldxid = ""; + if(wldxidVo!=null){ + wldxid = wldxidVo.getDbValue().toString(); + } + String wldxCode = getEnumManagerNew().getEnumItem(Long.parseLong(wldxid)).getEnumItemCode(); + String wldxvalue = wldxCode.substring(5); + subjson.put("wldx", wldxvalue); + subjson.put("fklx", "D3"); + jsonArray.add(subjson); + }else { + for (FormDataVo subFormDataVo : subFormMap) { + FieldDataVo bipNoVo = subFormDataVo.getFieldData("BIP单据号"); + if(bipNoVo!=null){ + istrue.add(bipNoVo.getStringValue()); + } + JSONObject subjson = new JSONObject(); + if("否".equals(isunit)) { + FieldDataVo psndoccodeVo = subFormDataVo.getFieldData("分账收款人编码"); + String psndoccode = ""; + if(psndoccodeVo!=null){ + psndoccode = psndoccodeVo.getStringValue(); + } + subjson.put("psndoccode", psndoccode); + subjson.put("suppliercode", psndoccode); + FieldDataVo skbankcodeVo = subFormDataVo.getFieldData("分账收款银行账号"); + String skbankcode = ""; + if(skbankcodeVo!=null){ + skbankcode = skbankcodeVo.getStringValue(); + } + subjson.put("skbankcode", skbankcode); + + }else { + FieldDataVo psndoccodeVo = formDataVo.getFieldData("收款单位编码"); + String psndoccode = ""; + if(psndoccodeVo!=null){ + psndoccode = psndoccodeVo.getStringValue(); + } + subjson.put("psndoccode", psndoccode); + subjson.put("suppliercode", psndoccode); + FieldDataVo skbankcodeVo = formDataVo.getFieldData("收款银行账号"); + String skbankcode = ""; + if(skbankcodeVo!=null){ + skbankcode = skbankcodeVo.getStringValue(); + } + subjson.put("skbankcode",skbankcode); + + } + FieldDataVo businessdateVo = formDataVo.getFieldData("单据日期"); + String businessdate = ""; + if(businessdateVo!=null){ + businessdate = businessdateVo.getStringValue(); + } + subjson.put("businessdate", businessdate); + JSONArray data = new JSONArray(); + JSONObject jsondata = new JSONObject(); + FieldDataVo scommentVo = formDataVo.getFieldData("摘要内容"); + String scomment = ""; + if(scommentVo!=null){ + scomment = scommentVo.getStringValue(); + } + jsondata.put("scomment", scomment); + FieldDataVo field0120Vo = subFormDataVo.getFieldData("分账税率"); + String field0120 = ""; + if(field0120Vo!=null){ + field0120 = field0120Vo.getStringValue(); + } + jsondata.put("field0120",field0120); + FieldDataVo field0121Vo = subFormDataVo.getFieldData("分账税额"); + String field0121 = ""; + if(field0121Vo!=null){ + field0121 = field0121Vo.getStringValue(); + } + jsondata.put("field0121",field0121); + FieldDataVo field0119Vo = subFormDataVo.getFieldData("分账行无税金额"); + String field0119 = ""; + if(field0119Vo!=null){ + field0119 = field0119Vo.getStringValue(); + } + jsondata.put("field0119", field0119); + FieldDataVo moneyVo = subFormDataVo.getFieldData("分账原币金额"); + String money = ""; + if(moneyVo!=null){ + money = moneyVo.getStringValue(); + } + jsondata.put("money", money); + FieldDataVo jsfsVo = formDataVo.getFieldData("结算方式编号"); + String jsfs = ""; + if(jsfsVo!=null){ + jsfs = jsfsVo.getStringValue(); + } + jsondata.put("jsfs", jsfs); + FieldDataVo kmdlVo = formDataVo.getFieldData("科目大类编号"); + String kmdl = ""; + if(kmdlVo!=null){ + kmdl = kmdlVo.getStringValue(); + } + jsondata.put("kmdl", kmdl); + FieldDataVo szxmVo = formDataVo.getFieldData("收支项目编号"); + String szxm = ""; + if(szxmVo!=null){ + szxm = szxmVo.getStringValue(); + } + jsondata.put("szxm", szxm); + jsondata.put("fkyw", "OA"); + data.add(jsondata); + subjson.put("data", data); + if("是".equals(isbear)) { + FieldDataVo orgcodeVo = subFormDataVo.getFieldData("分账组织编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode", orgcode); + FieldDataVo fkbankcodeVo = subFormDataVo.getFieldData("分账付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode", fkbankcode); + } + else { + FieldDataVo orgcodeVo = formDataVo.getFieldData("主表支付公司编码"); + String orgcode = ""; + if(orgcodeVo!=null){ + orgcode = orgcodeVo.getStringValue(); + } + subjson.put("orgcode", orgcode); + FieldDataVo fkbankcodeVo = formDataVo.getFieldData("付款银行账号"); + String fkbankcode = ""; + if(fkbankcodeVo!=null){ + fkbankcode = fkbankcodeVo.getStringValue(); + } + subjson.put("fkbankcode", fkbankcode); + } + subjson.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId); + FieldDataVo oabillcodeVo = subFormDataVo.getFieldData("分账单据流水号"); + String oabillcode = ""; + if(oabillcodeVo!=null){ + oabillcode = oabillcodeVo.getStringValue(); + } + subjson.put("oabillcode", oabillcode); + FieldDataVo field0006Vo = formDataVo.getFieldData("原始单据数"); + String field0006 = ""; + if(field0006Vo!=null){ + field0006 = field0006Vo.getStringValue(); + } + subjson.put("field0006", field0006); + FieldDataVo ytVo = formDataVo.getFieldData("摘要内容"); + String yt = ""; + if(ytVo!=null){ + yt = ytVo.getStringValue(); + } + subjson.put("yt", yt); + //业务流程 + String wldxid = ""; + FieldDataVo wldxidVo = subFormDataVo.getFieldData("往来对象"); + if(wldxidVo!=null){ + wldxid = wldxidVo.getDbValue().toString(); + } + String wldxCode = getEnumManagerNew().getEnumItem(Long.parseLong(wldxid)).getEnumItemCode(); + String wldxvalue = wldxCode.substring(5); + subjson.put("wldx", wldxvalue); + subjson.put("fklx", "D3"); + jsonArray.add(subjson); + } + } + + jsonObject.put("data", jsonArray); + System.out.println(istrue.size()==subFormMap.size()); + if(istrue.size()==subFormMap.size()) { + jsonObject = new JSONObject(); + } + return jsonObject; + } + + /** + * 薪酬分账终止参数 + * @param formDataVo + * @return + * @throws IOException + */ + public JSONObject getXinChouFenZhangStopParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// System.out.println("设置终止参数"); + FieldDataVo billcodeVo = formDataVo.getFieldData("NC单据编号"); + String billcode = ""; + if(billcodeVo!=null){ + billcode = billcodeVo.getStringValue(); + } +// String billcode = CAP4FormKit.getFieldStrValue(master, "NC单据编号"); + jsonObject.put("billcode", billcode); + jsonObject.put("status", "0"); + System.out.println("终止参数:"+jsonObject); + return jsonObject; + } + + /** + * 社保分账终止参数 + * @param formDataVo + * @return + * @throws IOException + */ + public JSONObject getSheBaoFenZhangStopParam( FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// System.out.println("设置终止参数"); + FieldDataVo billcodeVo = formDataVo.getFieldData("BIP单据编号"); + String billcode = ""; + if(billcodeVo!=null){ + billcode = billcodeVo.getStringValue(); + } +// String billcode = CAP4FormKit.getFieldStrValue(master, "BIP单据编号"); + jsonObject.put("compose_pk", billcode); + jsonObject.put("status", 1); + System.out.println("终止参数:"+jsonObject); + return jsonObject; + } + + /** + * 薪酬分账结束参数 + * @param formDataVo + * @return + * @throws IOException + */ + public JSONObject getXinChouFenZhangEndParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + FieldDataVo billcodeVo = formDataVo.getFieldData("NC单据编号"); + String billcode = ""; + if(billcodeVo!=null){ + billcode = billcodeVo.getStringValue(); + } + jsonObject.put("billcode", billcode); + jsonObject.put("status", "1"); + System.out.println("流程结束参数:"+jsonObject); + return jsonObject; + } + + + /** + * 社保分账结束参数 + * @param formDataVo + * @return + * @throws IOException + */ + public JSONObject getSheBaoFenZhangEndParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + FieldDataVo billcodeVo = formDataVo.getFieldData("BIP单据编号"); + String billcode = ""; + if(billcodeVo!=null){ + billcode = billcodeVo.getStringValue(); + } + jsonObject.put("compose_pk", billcode); + jsonObject.put("status", 2); + System.out.println("流程结束参数:"+jsonObject); + return jsonObject; + } + + + /** + * 通用收款参数 + * @param formDataVo + * @return + * @throws IOException + */ + public JSONObject getTongyongshoukuanParam(FormDataVo formDataVo,String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + System.out.println("设置通用收款参数"); +// jsonObject.put("oabillcode", CAP4FormKit.getFieldStrValue(master, "单据流水号")); + jsonObject.put("oabillcode", formDataVo.getFieldData("单据流水号")!=null?formDataVo.getFieldData("单据流水号").getStringValue():""); + jsonObject.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId); +// jsonObject.put("financialOrg", CAP4FormKit.getFieldStrValue(master, "BIP公司编号")); + jsonObject.put("financialOrg", formDataVo.getFieldData("BIP公司编号")!=null?formDataVo.getFieldData("BIP公司编号").getStringValue():""); +// jsonObject.put("billDate", CAP4FormKit.getFieldStrValue(master, "单据日期")); + jsonObject.put("billDate", formDataVo.getFieldData("单据日期")!=null?formDataVo.getFieldData("单据日期").getStringValue():""); +// jsonObject.put("customer", CAP4FormKit.getFieldStrValue(master, "客商编号")); + jsonObject.put("customer", formDataVo.getFieldData("客商编号")!=null?formDataVo.getFieldData("客商编号").getStringValue():""); +// jsonObject.put("paymentAccount", CAP4FormKit.getFieldStrValue(master, "付款银行账号")); + jsonObject.put("paymentAccount", formDataVo.getFieldData("付款银行账号")!=null?formDataVo.getFieldData("付款银行账号").getStringValue():""); +// jsonObject.put("settlementMethod", CAP4FormKit.getFieldStrValue(master, "结算方式编码")); + jsonObject.put("settlementMethod", formDataVo.getFieldData("结算方式编码")!=null?formDataVo.getFieldData("结算方式编码").getStringValue():""); +// jsonObject.put("recAccount", CAP4FormKit.getFieldStrValue(master, "收款银行账号")); + jsonObject.put("recAccount", formDataVo.getFieldData("收款银行账号")!=null?formDataVo.getFieldData("收款银行账号").getStringValue():""); +// jsonObject.put("psndoc", CAP4FormKit.getFieldStrValue(master, "业务员编码")); + jsonObject.put("psndoc", formDataVo.getFieldData("业务员编码")!=null?formDataVo.getFieldData("业务员编码").getStringValue():""); +// String sklxId = CAP4FormKit.getFieldStrValue(master, "收款类型"); + String sklxId = formDataVo.getFieldData("收款类型")!=null?formDataVo.getFieldData("收款类型").getDbValue()+"":""; + String sklxCode = getEnumManagerNew().getEnumItem(Long.parseLong(sklxId)).getEnumItemCode(); + jsonObject.put("sklx",sklxCode); +// jsonObject.put("def29", CAP4FormKit.getFieldStrValue(master, "摘要")); + jsonObject.put("def29", formDataVo.getFieldData("摘要")!=null?formDataVo.getFieldData("摘要").getStringValue():""); +// jsonObject.put("prepay", CAP4FormKit.getFieldStrValue(master, "收款性质")); + jsonObject.put("prepay", formDataVo.getFieldData("收款性质")!=null?formDataVo.getFieldData("收款性质").getStringValue():""); + + //该超级节点存在多流程共用情况,通过不同变量,兼容不同表单的数据域 + String subName =formDataVo.getFieldData("明细表名称")!=null?formDataVo.getFieldData("明细表名称").getStringValue():""; +// StringUtils.isEmpty(formDataVo.getFieldData("明细表名称")!=null?formDataVo.getFieldData("明细表名称").getStringValue():"")?"通用收费明细":CAP4FormKit.getFieldStrValue(master, "明细表名称"); + subName = StringUtils.isEmpty(subName)?"通用收费明细":subName; + List subFormDataVos = formDataVo.getSubFormMap().get(subName); +// List formDataSubBeans = CAP4FormKit.getSubBeans(master,subName); + JSONArray jsonArray = new JSONArray(); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject items = new JSONObject(); + //该超级节点存在多流程共用情况,通过不同变量,兼容不同表单的数据域 + String skywName =formDataVo.getFieldData("明细表名称")!=null?formDataVo.getFieldData("明细表名称").getStringValue():""; +// StringUtils.isEmpty(CAP4FormKit.getFieldStrValue(master, "收款业务类型名称"))?"收款业务类型编码":CAP4FormKit.getFieldStrValue(master, "收款业务类型名称"); + skywName = StringUtils.isEmpty(skywName)?"收款业务类型编码":skywName; + +// items.put("skyw", CAP4FormKit.getSubFieldValue(formDataSubBean, skywName)); + items.put("skyw", subFormDataVo.getFieldData(skywName)!=null?subFormDataVo.getFieldData(skywName).getStringValue():""); +// items.put("money", CAP4FormKit.getSubFieldValue(formDataSubBean, "本次收款金额")); + items.put("money", subFormDataVo.getFieldData("本次收款金额")!=null?subFormDataVo.getFieldData("本次收款金额").getStringValue():""); +// items.put("field0120", CAP4FormKit.getSubFieldValue(formDataSubBean, "税率")); + items.put("field0120", subFormDataVo.getFieldData("税率")!=null?subFormDataVo.getFieldData("税率").getStringValue():""); +// items.put("field0121", CAP4FormKit.getSubFieldValue(formDataSubBean, "税额")); + items.put("field0121", subFormDataVo.getFieldData("税额")!=null?subFormDataVo.getFieldData("税额").getStringValue():""); +// items.put("field0119", CAP4FormKit.getSubFieldValue(formDataSubBean, "无税金额")); + items.put("field0119", subFormDataVo.getFieldData("无税金额")!=null?subFormDataVo.getFieldData("无税金额").getStringValue():""); +// String subjectCode = CAP4FormKit.getSubFieldValue(formDataSubBean, "科目大类编码").toString(); + String subjectCode =subFormDataVo.getFieldData("科目大类编码")!=null?subFormDataVo.getFieldData("科目大类编码").getStringValue():""; + subjectCode = subjectCode.substring(5); + items.put("subjectCode", subjectCode);//科目大类01-应收款项,02-预收款项 +// items.put("scomment", CAP4FormKit.getSubFieldValue(formDataSubBean, "备注")); + items.put("scomment", subFormDataVo.getFieldData("备注")!=null?subFormDataVo.getFieldData("备注").getStringValue():""); +// items.put("szxm", CAP4FormKit.getSubFieldValue(formDataSubBean, "收支项目编码")); + items.put("szxm",subFormDataVo.getFieldData("收支项目编码")!=null?subFormDataVo.getFieldData("收支项目编码").getStringValue():""); + jsonArray.add(items); + } + jsonObject.put("items", jsonArray); +// System.out.println("通用收款参数:"+jsonObject); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/bipjson/"+date.substring(0,4)+"/"+date.substring(5,6)+"/"+date.substring(7,8)+"/TYSK_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/ProtUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/ProtUtil.java new file mode 100644 index 0000000..6ad000a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_file/util/ProtUtil.java @@ -0,0 +1,132 @@ +package com.seeyon.apps.jync_file.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpResponse; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import com.alibaba.fastjson.JSONObject; + +public class ProtUtil { + private static final Log log = LogFactory.getLog(ProtUtil.class); + + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public static JSONObject doPost(JSONObject param, String urlStr,JSONObject headerer) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + System.out.println(urlStr); + try { + URL url = new URL(urlStr); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", headerer.getString("Content-Type")); + connection.setRequestProperty("ts", headerer.getString("ts")); + connection.setRequestProperty("client_id", headerer.getString("client_id")); + connection.setRequestProperty("client_security", headerer.getString("client_security")); + connection.setRequestProperty("signature", headerer.getString("signature")); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + String str = param.toString(); + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + System.out.println(connection.getResponseCode()); + log.info("调用接口,返回状态"+connection.getResponseCode()); + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + System.out.println(result); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/event/SheBaoFenZhangEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/event/SheBaoFenZhangEvent.java new file mode 100644 index 0000000..3ef242f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/event/SheBaoFenZhangEvent.java @@ -0,0 +1,85 @@ +package com.seeyon.apps.jync_fz.event; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.event.ACommonWorkflowEvent; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.WorkflowEventContext; +import com.seeyon.ctp.common.AppContext; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.ParamUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; + +public class SheBaoFenZhangEvent extends ACommonWorkflowEvent { + + private static final Log log = Log.get(SheBaoFenZhangEvent.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] { WorkFlowType.onBeforeStop }; + } + + @Override + public String getId() { + return "sheBaoFenZhangEvent"; + } + + @Override + public String getLabel() { + return "OA社保分账单流程监听"; + } + + @Override + protected WorkflowEventContext proceed(String request, FormDataVo formDataVo, WorkFlowType workFlowType, FormDataMasterBean formDataMasterBean) throws Exception { + WorkflowEventContext context = new WorkflowEventContext(); +// ConfigVo configVo = cstConfigApi.getConfig(getPluginId()); + context.setNeedSave(true); + System.out.println("进入终止操作"); + try { + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + JSONObject jsonObject = paramUtil.getSheBaoFenZhangStopParam(formDataVo); + log.info("接口终止,参数记录:"+jsonObject); + String url = PropKit.getProp(PropKit.SBFZCANCELURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + if(res.isEmpty()) { + context.setSuccess(false); + context.setErrMsg("请求失败"); + return context; + } + String status = res.getString("status"); + if(!"1".equals(status)) { + context.setSuccess(false); + context.setErrMsg(res.getString("msg")); + return context; + } + }catch (Exception e) { + context.setSuccess(false); + context.setErrMsg(e.getMessage()); + return context; + } + context.setSuccess(true); + context.setErrMsg("请求成功"); + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/event/XinChouFenZhangEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/event/XinChouFenZhangEvent.java new file mode 100644 index 0000000..052f9bc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/event/XinChouFenZhangEvent.java @@ -0,0 +1,84 @@ +package com.seeyon.apps.jync_fz.event; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.event.ACommonWorkflowEvent; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.WorkflowEventContext; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.ParamUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class XinChouFenZhangEvent extends ACommonWorkflowEvent { + + private static final Log log = Log.get(XinChouFenZhangEvent.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] { WorkFlowType.onBeforeStop }; + } + + @Override + public String getId() { + return "xinChouFenZhangEvent"; + } + + @Override + public String getLabel() { + return "OA薪酬分账单流程监听"; + } + + @Override + protected WorkflowEventContext proceed(String request, FormDataVo formDataVo, WorkFlowType workFlowType, FormDataMasterBean formDataMasterBean) throws Exception { + WorkflowEventContext context = new WorkflowEventContext(); + context.setNeedSave(true); + System.out.println("进入终止操作"); + try { + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + JSONObject jsonObject = paramUtil.getXinChouFenZhangStopParam(formDataVo); + log.info("接口终止,参数记录:"+jsonObject); + String url = PropKit.getProp(PropKit.XCFZCANCELURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.XCFZCANCELURL), headerer); + context.setResponse(res.toString()); + if(res.isEmpty()) { + context.setSuccess(false); + context.setErrMsg("请求失败"); + return context; + } + String status = res.getString("status"); + if(!"1".equals(status)) { + context.setSuccess(false); + context.setErrMsg(res.getString("msg")); + return context; + } + }catch (Exception e) { + context.setSuccess(false); + context.setErrMsg(e.getMessage()); + return context; + } + context.setSuccess(true); + context.setErrMsg("请求成功"); + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/SheBaoFenZhangNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/SheBaoFenZhangNode.java new file mode 100644 index 0000000..01d19a2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/SheBaoFenZhangNode.java @@ -0,0 +1,176 @@ +package com.seeyon.apps.jync_fz.node; + +import java.util.List; +import java.util.Map; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.collaboration.po.ColSummary; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.ParamUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; + +public class SheBaoFenZhangNode extends ACommonSuperNode { + + private static Log log = Log.get(SheBaoFenZhangNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + @Override + public String getNodeId() { + return "SheBaoFenZhangNode"; + } + @Override + public String getNodeName() { + return "社保分账审批单超级节点"; + } + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + +// public ConfigVo getMemberMamageConfig() { +// return cstConfigApi.getConfig(getPluginId()); +// } + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { +// 进入超级审核节点 + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + System.out.println("开始处理单据SheBaoFenZhangNode"); +// 封装推送接口参数调用接口 + try { + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + ColSummary summary = formDataVo.getColSummary(); + JSONObject jsonObject = paramUtil.getSheBaoFenZhangParam(formDataVo,summary+""); + context.setRequest(jsonObject.toString()); + if(jsonObject.size()==0) { + JSONObject endJsonObject = paramUtil.getSheBaoFenZhangEndParam(formDataVo); + context.setRequest(endJsonObject.toString()); + log.info("接口流程结束,参数记录:"+endJsonObject); + String url = PropKit.getProp(PropKit.SBFZCANCELURL); + context.setUrl(url); + JSONObject EndRes = ProtUtil.doPost(endJsonObject, url, headerer); + if(EndRes.isEmpty()) { + context.setResponse(EndRes.toString()); + context.back("流程状态改变失败"); + context.setErrMsg("流程状态改变失败"); + } + String status = EndRes.getString("status"); + if(!"2".equals(status)) { + context.setResponse(EndRes.toString()); + context.back("流程状态改变失败"); + context.setErrMsg("流程状态改变失败"); + } + } + String url = PropKit.getProp(PropKit.TRANSFORMURL); + context.setUrl(url); + JSONObject res = ProtUtil.doPost(jsonObject,url , headerer); + context.setResponse(res.toString()); + if(res==null) { + context.back("接口调用失败,未正常返回结果"); + context.setErrMsg("接口调用失败,未正常返回结果"); + return context; + } + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + context.success(msg); + + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + + String[] nos = msg.split("【"); + FieldDataVo isbearidVo = formDataVo.getFieldData("支付公司是否成本承担公司"); + String isbearid = ""; + if(isbearidVo != null){ + isbearid = isbearidVo.getStringValue(); + } + String isbear = ""; + if("".equals(isbearid)){ + isbear = "否"; + }else { + isbear = getEnumManagerNew().getEnumItem(Long.parseLong(isbearid)).getLabel(); + } + FieldDataVo isunitidVo = formDataVo.getFieldData("是否同一收款单位"); + String isunitid = ""; + if(isunitidVo!=null){ + isunitid = isunitidVo.getStringValue(); + } + String isunit = ""; + if("".equals(isunit)){ + isunit = "是"; + }else { + isunit = getEnumManagerNew().getEnumItem(Long.parseLong(isunitid)).getLabel(); + } + if(!("是".equals(isunit) && "否".equals(isbear))){ + int i = 0; + for (FormDataVo subFormDataVo : subFormMap) { + i++; + String[] bipNo = nos[i].split("BIP单据号:"); + subFormDataVo.getNewFieldDataMap().put("BIP单据号", bipNo[1].substring(0,bipNo[1].length()-3)); + } + } + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:"+msg); + JSONObject endJsonObject = paramUtil.getSheBaoFenZhangEndParam(formDataVo); + log.info("接口流程结束,参数记录:"+endJsonObject); + String endurl = PropKit.getProp(PropKit.SBFZCANCELURL); + JSONObject EndRes = ProtUtil.doPost(endJsonObject, endurl, headerer); + context.setResponse(res.toString()); + if(EndRes.isEmpty()) { + context.back("流程状态改变失败"); + context.setErrMsg("流程状态改变失败"); + } + String status = EndRes.getString("status"); + if(!"2".equals(status)) { + context.back("流程状态改变失败"); + context.setErrMsg("流程状态改变失败"); + }else { + context.success(msg); + } + }else { + context.back(msg); + context.setErrMsg(msg); + } + } catch (Exception e) { + e.printStackTrace(); + context.back("异常:"+e); + context.setErrMsg("异常:"+e); + } + return context; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/TongYongFenZhangNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/TongYongFenZhangNode.java new file mode 100644 index 0000000..4e59d8a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/TongYongFenZhangNode.java @@ -0,0 +1,125 @@ +package com.seeyon.apps.jync_fz.node; + +import java.util.List; +import java.util.Map; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.collaboration.po.ColSummary; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.ParamUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class TongYongFenZhangNode extends ACommonSuperNode { + + private static Log log = Log.get(TongYongFenZhangNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "tongYongFenZhangNode"; + } + + @Override + public String getNodeName() { + return "通用分账审批单超级节点"; + } + + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } +// public ConfigVo getMemberMamageConfig() { +// return cstConfigApi.getConfig(getPluginId()); +// } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + System.out.println("开始处理单据TongYongFenZhangNode"); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + FieldDataVo isVo = formDataVo.getFieldData("是否推送NC"); + String is = ""; + if(isVo!=null){ + is = isVo.getStringValue(); + } + if(!"1".equals(is)) { + context.success("不推送BIP付款单,跳过处理!"); + return context; + } +// 封装推送接口参数调用接口 + try { + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + ColSummary colSummary = formDataVo.getColSummary(); + JSONObject jsonObject = paramUtil.getTongYongFenZhangParam(formDataVo,colSummary.getId()+""); + context.setRequest(jsonObject.toString()); + String url = PropKit.getProp(PropKit.TRANSFORMURL); + context.setUrl(url); + JSONObject res = ProtUtil.doPost(jsonObject,url, headerer); + if(res==null) { + context.back("接口调用失败,未正常返回结果"); + context.setErrMsg("接口调用失败,未正常返回结果"); + return context; + } + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + context.success(msg); + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + String[] nos = msg.split("【"); + int i = 0; + for (FormDataVo subFormDataVo : subFormMap) { + FieldDataVo numVo = subFormDataVo.getFieldData("分账原币金额"); + String num = ""; + if(numVo!=null){ + num = numVo.getStringValue(); + } + if("0".equals(num)) { + FieldDataVo fieldDataVo = subFormDataVo.getFieldData("分账原币金额"); + log.info("分账原币金额为0,跳过处理单据号回写:"+ fieldDataVo.getStringValue()); + continue; + }else { + i++; + String[] bipNo = nos[i].split("BIP单据号:"); + subFormDataVo.getNewFieldDataMap().put("BIP单据号", bipNo[1].substring(0,bipNo[1].length()-3)); + } + } + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:"+msg); + }else { + context.back("推送BIP失败:"+msg); + context.setErrMsg("推送BIP失败:"+msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:"+msg); + } + } catch (Exception e) { + e.printStackTrace(); + context.back("OA处理异常:"+e); + context.setErrMsg("OA处理异常:"+e); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "OA处理异常:"+e); + } + log.info("返回通用分账超级节点数据"); + return context; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/XinChouFenZhangNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/XinChouFenZhangNode.java new file mode 100644 index 0000000..d543bbf --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/jync_fz/node/XinChouFenZhangNode.java @@ -0,0 +1,134 @@ +package com.seeyon.apps.jync_fz.node; + +import java.util.List; +import java.util.Map; + +import cn.hutool.log.Log; +import com.seeyon.apps.bip.constants.BipConstants; +import com.seeyon.apps.collaboration.po.ColSummary; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.jync_file.kit.PropKit; +import com.seeyon.apps.jync_file.util.HeaderUtil; +import com.seeyon.apps.jync_file.util.ParamUtil; +import com.seeyon.apps.jync_file.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class XinChouFenZhangNode extends ACommonSuperNode { + +// private static final Log log = LogFactory.getLog(XinChouFenZhangNode.class); + private static Log log = Log.get(XinChouFenZhangNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + @Override + public String getNodeId() { + return "xinChouFenzhangNode"; + } + @Override + public String getNodeName() { + return "薪酬分账审批单超级节点"; + } + @Override + public String getPluginId() { + return BipConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } +// public ConfigVo getMemberMamageConfig() { +// return cstConfigApi.getConfig(getPluginId()); +// } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) { + //进入超级审核节点 +// SuperNodeResponse response = new SuperNodeResponse(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + System.out.println("开始处理单据XinChouFenZhangNode"); +// 封装推送接口参数调用接口 + try { + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + ColSummary summary = formDataVo.getColSummary(); + JSONObject jsonObject = paramUtil.getXinChouFenZhangParam(formDataVo,summary.getId()+""); + context.setRequest(jsonObject.toString()); + if(jsonObject.size()==0) { + JSONObject endJsonObject = paramUtil.getXinChouFenZhangEndParam(formDataVo); + log.info("接口流程结束,参数记录:"+endJsonObject); + JSONObject EndRes = ProtUtil.doPost(endJsonObject, PropKit.getProp(PropKit.XCFZCANCELURL), headerer); + if(EndRes.isEmpty()) { + context.back("接口调用异常,流程状态改变失败"); + context.setErrMsg("接口调用异常,流程状态改变失败"); + } + String status = EndRes.getString("status"); + if(!"1".equals(status)) { + context.back("流程状态改变失败:"+EndRes.get("msg").toString()); + context.setErrMsg("流程状态改变失败:"+EndRes.get("msg").toString()); + }else { + context.success("流程状态改变成功"); + } + return context; + } + JSONObject res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.TRANSFORMURL), headerer); + if(res==null) { + context.back("接口调用失败,未正常返回结果"); + context.setErrMsg("接口调用失败,未正常返回结果"); + return context; + } + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + context.success("推送BIP成功:"+msg); + + Map> subFormMaps = formDataVo.getSubFormMap(); + List subFormMap = subFormMaps.get("分账明细表"); + String[] nos = msg.split("【"); + int i = 0; + for (FormDataVo subFormDataVo : subFormMap) { + i++; + String[] bipNo = nos[i].split("BIP单据号:"); + subFormDataVo.getNewFieldDataMap().put("BIP单据号", bipNo[1].substring(0,bipNo[1].length()-3)); + } + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP成功:"+msg); + JSONObject endJsonObject = paramUtil.getXinChouFenZhangEndParam(formDataVo); + log.info("接口流程结束,参数记录:"+endJsonObject); + JSONObject EndRes = ProtUtil.doPost(endJsonObject, PropKit.getProp(PropKit.XCFZCANCELURL), headerer); + if(EndRes.isEmpty()) { + context.back("流程状态改变失败"); + context.setErrMsg("流程状态改变失败"); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "流程状态改变失败"); + } + String status = EndRes.getString("status"); + if(!"1".equals(status)) { + context.back("流程状态改变失败"+EndRes.getString("msg")); + context.setErrMsg("流程状态改变失败"+EndRes.getString("msg")); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "流程状态改变失败"+EndRes.getString("msg")); + }else { + context.success(msg); + } + }else { + context.back(msg); + context.setErrMsg(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", msg); + } + } catch (Exception e) { + e.printStackTrace(); + context.back("异常:"+e); + context.setErrMsg("异常:"+e); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "异常:"+e); + } + return context; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java new file mode 100644 index 0000000..14c7768 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.qrCodeForm; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/8/11 + */ +public class QrCodeFormPluginApi extends APluginInfoApi { + + @Override + public String getPluginId() { + return QrCodeFormConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return "致威互联"; + } + + @Override + public String getDescription() { + return "微信扫码制单"; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (QrCodeFormConstants value : QrCodeFormConstants.values()) { + if(value != QrCodeFormConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java new file mode 100644 index 0000000..49755c4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.qrCodeForm; + +import com.seeyon.apps.qrCodeForm.util.InitQrCodeFormUitl; +import com.seeyon.ctp.common.AbstractSystemInitializer; +import com.seeyon.ctp.common.exceptions.BusinessException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class QrCodeFormPluginInitializer extends AbstractSystemInitializer { + private static Log log = LogFactory.getLog(QrCodeFormPluginInitializer.class); + + public QrCodeFormPluginInitializer() { + } + + public void destroy() { + log.info("◆二维码扫码填单插件销毁成功!"); + } + + public void initialize() { + InitQrCodeFormUitl.initMenu(); + log.info("◆二维码扫码填单插件初始化成功!"); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java new file mode 100644 index 0000000..d065422 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/Constants.java @@ -0,0 +1,15 @@ +package com.seeyon.apps.qrCodeForm.constant; + +import com.seeyon.ctp.common.AppContext; + +public class Constants { + + //模拟移动端登录认证方式 + public static final String _REDIRECTURI = "/qrCodeForm.do?method=newMain&html="; + //流程表单跳转地址 + public static final String FLOW_URL = "/seeyon/m3/apps/v5/collaboration/html/newCollaboration.html?qc=ext&templateId="; + //无流程表单跳转地址 + public static final String UNFLOW_URL = "/seeyon/m3/apps/v5/cap4/htmls/native/form/index.html?"; + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java new file mode 100644 index 0000000..686a0da --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java @@ -0,0 +1,32 @@ +package com.seeyon.apps.qrCodeForm.constant; + +public enum QrCodeFormConstants { + + plugin("qrCodeForm","插件ID"), + oaAddress("https://oa.hbsxly.com", "OA地址"), + qwAppId("", "企微APPID"), + restId("qrcode", "rest账号"), + restPwd("2fbee5ed-ef79-433d-86dd-b93b3f5b80a1", "rest密码"), + qrcode_loginname("oatest", "发起人账号"); + + QrCodeFormConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java new file mode 100644 index 0000000..6051998 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java @@ -0,0 +1,31 @@ +package com.seeyon.apps.qrCodeForm.constant; + +import com.seeyon.ctp.common.code.EnumsCode; +import com.seeyon.ctp.common.i18n.ResourceUtil; + +public enum SupportTypeEnum implements EnumsCode { + ALL(0, "全部"), + FLOW(1, "仅支持流程表单"), + UNFLOW(2, "仅支持无流程表单"); + + private int key; + private String text; + + private SupportTypeEnum(int key, String text) { + this.key = key; + this.text = text; + } + + public String getValue() { + return String.valueOf(this.key); + } + + public int getKey() { + return this.key; + } + + public String getText() { + return ResourceUtil.getString(this.text); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java new file mode 100644 index 0000000..a80fbb5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java @@ -0,0 +1,112 @@ +package com.seeyon.apps.qrCodeForm.controller; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.apps.qrCodeForm.manager.QrCodeFormManager; +import com.seeyon.apps.qrCodeForm.util.LoginUtil; +import com.seeyon.apps.weixin.util.SecurityCertUtil; +import com.seeyon.apps.weixin.util.WeixinUtil; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.constants.ProductEditionEnum; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.flag.SysFlag; +import com.seeyon.ctp.common.formula.FormulaUtil; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.Inject; +import org.apache.commons.logging.Log; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class QrCodeFormController extends BaseController { + private static Log log = CtpLogFactory.getLog(QrCodeFormController.class); + @Inject + private QrCodeFormManager qrCodeFormManager; + @Inject + private OrgManager orgManager; + @Inject + private ICstConfigApi cstConfigApi; + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) { + log.info("访问二维码生成页面!"); + ModelAndView mav = new ModelAndView("plugin/qrCodeForm/qrCodeFormIndex"); + Map map = new HashMap(); + map.put("bizType", "1"); + map.put("type", "owner-authed-biz"); + map.put("businessType", 0); + map.put("activeTab", "mineapp"); + List> bizList = qrCodeFormManager.listBusiness(map); + mav.addObject("bizList", bizList); + return mav; + } + +// https://oa.dhx.com.cn/seeyon/qrCodeForm.do?method=newMain&type=1 + public ModelAndView newMain(HttpServletRequest request, HttpServletResponse response) throws Exception { + ModelAndView mav = new ModelAndView("/wechat/collaborationContent"); + String html = ""; + String type = request.getParameter("type"); + if(Strings.isNotBlank(type)) { + //获取集成平台中url1的连接地址;/seeyon/m3/apps/v5/collaboration/html/newCollaboration.html?qc=ext&templateId=-2617827166221087111 + //可以通过配置完成地址的获取 + html = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), "url" + type); + } + if(Strings.isBlank(html)) { + html = URLDecoder.decode(request.getParameter("html"), "UTF-8"); + } +// String loginName = qrCodeFormManager.getLoginMember(code); + /** + * 客开改动,固定登录名 + */ + //String loginName = (String) FormulaUtil.getVar("qrcode_loginname"); + String loginName = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.qrcode_loginname.name()); + log.info("登录认证获取loginName为:" + loginName); + if(Strings.isEmpty(loginName)){ +// mav.addObject("msg", "未获取到人员信息!")b; +// return mav; + loginName = "seeyon"; + } + + V3xOrgMember member = orgManager.getMemberByLoginName(loginName); + if(member == null){ + mav.addObject("msg", "人员不存在!"); + return mav; + } + SecurityCertUtil.login(request, loginName); + + Map map = LoginUtil.getToken(String.valueOf(member.getId()), member.getLoginName(), request, response); + String success = String.valueOf(map.get("success")); + if (success != null && "false".equals(success)) { +// String message = map.get("message").toString(); +// if (message.contains("User not found")) { +// mav.addObject("msg", ResourceUtil.getString("wxt.user.binding.miss") +// + "," + ResourceUtil.getString("wxt.user.name") + wechatUser.getXtUserName() + +// "," + ResourceUtil.getString("wxt.dingding.user.id") + wechatUser.getXtUserId()); +// } else { +// } + mav.addObject("msg", (String) map.get("message")); + return mav; + } + + String token = (String) map.get("id"); + String suffix = (String) SysFlag.mobileEditionSuffix.getFlag(); + String edition = ProductEditionEnum.getCurrentProductEditionEnum().getValue(); + String v5timestamp = WeixinUtil.getV5Timestamp(); + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name()); + if (Strings.isNotBlank(html)) { + String url = address + "" + SystemEnvironment.getContextPath() + "/H5/collaboration/index.html?token=" + token + "&edition=" + edition + "&suffix=" + suffix + "&v5timestamp=" + v5timestamp + "&loginName=" + member.getLoginName() + "&html=" + URLEncoder.encode(html, "UTF-8") + "&isAccount=&accountid=" + member.getOrgAccountId() + "&appid="; + return new ModelAndView("redirect:" + url); + } else { + return new ModelAndView("redirect:" + address + "" + SystemEnvironment.getContextPath() + "/H5/collaboration/index.html?token=" + token + "&edition=" + edition + "&suffix=" + suffix + "&v5timestamp=" + v5timestamp + "&loginName=" + member.getLoginName() + "&html=&isAccount=&accountid=" + member.getOrgAccountId()); + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java new file mode 100644 index 0000000..06f5211 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java @@ -0,0 +1,18 @@ +package com.seeyon.apps.qrCodeForm.manager; + +import com.seeyon.cap4.form.modules.business.FormAppBO; +import com.seeyon.ctp.util.annotation.AjaxAccess; + +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +public interface QrCodeFormManager { + @AjaxAccess + List> listBusiness(Map params); + + @AjaxAccess + List listFormApp(Map params); + + Map qrCodeFormUrl(Map params) throws UnsupportedEncodingException; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java new file mode 100644 index 0000000..d7e633e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java @@ -0,0 +1,160 @@ +package com.seeyon.apps.qrCodeForm.manager; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.qrCodeForm.constant.Constants; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.apps.qrCodeForm.constant.SupportTypeEnum; +import com.seeyon.apps.weixin.manager.WechatUserManager; +import com.seeyon.apps.weixin.po.WechatUser; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.modules.business.BusinessSourceTypeManager; +import com.seeyon.cap4.form.modules.business.FormAppBO; +import com.seeyon.cap4.form.util.BizUtil; +import com.seeyon.cap4.form.util.Enums; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.FlipInfo; +import com.seeyon.ctp.util.HttpClientUtil; +import com.seeyon.ctp.util.ParamUtil; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.AjaxAccess; +import com.seeyon.ctp.util.annotation.Inject; +import org.apache.commons.logging.Log; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class QrCodeFormManagerImpl implements QrCodeFormManager { + + private static Log log = CtpLogFactory.getLog(QrCodeFormManagerImpl.class); + + @Inject + private FormApi4Cap4 formApi4Cap4; + @Inject + private OrgManager orgManager; + @Inject + private ICstConfigApi cstConfigApi; + @Inject + public WechatUserManager wechatUserManager; + + + /** + * 获取应用包数据 + * + * @param params + * @return + */ + @Override + @AjaxAccess + public List> listBusiness(Map params) { + List> listMap = new ArrayList>(); + try { + FlipInfo fi = new FlipInfo(1, -1); + Map resultMap = formApi4Cap4.listBusiness(fi, params); + if (Strings.isNotEmpty(fi.getData())) { + listMap = fi.getData(); + } + } catch (BusinessException e) { + e.printStackTrace(); + } + return listMap; + } + + /** + * 获取所有的应用下的模板 + * + * @param params + * @return + */ + @AjaxAccess + @Override + public List listFormApp(Map params) { + List returnList = new ArrayList<>(); + String type = ParamUtil.getString(params, "type"); + String bizConfigId = ParamUtil.getString(params, "bizConfigId"); + BusinessSourceTypeManager sourceType = BizUtil.getSourceTypeById(type); + Long bizConfigL = 0L; + if (Strings.isNotBlank(bizConfigId)) { + bizConfigL = Long.parseLong(bizConfigId); + } + try { + List allList = sourceType.getFormAppBOList(AppContext.getCurrentUser(), "", "", false, bizConfigL); + if (Strings.isNotEmpty(allList)) { + returnList = allList.stream().filter(a -> !"PARENT".equals(a.getSourctTypeName())).collect(Collectors.toList()); + } + } catch (BusinessException e) { + log.error("获取所有模板异常", e); + } + return returnList; + } + + @Override + @AjaxAccess + public Map qrCodeFormUrl(Map params) throws UnsupportedEncodingException { + Map result = new HashMap<>(); + Integer sourceType = ParamUtil.getInt(params, "sourceType"); + //String fillUrl = Constants._URLTPL.replaceAll("\\{corpId}", Constants._CORPID); + String fillUrl; + String _redirecturi = Constants._REDIRECTURI; + if (sourceType == Enums.SourceType.SOURCE_TYPE_FLOWTEMPLATE.getKey()) { + String templateId = ParamUtil.getString(params, "templateId"); + String tourl = Constants.FLOW_URL + templateId; + try { +// fillUrl = fillUrl + URLEncoder.encode( + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name());; + fillUrl = address + SystemEnvironment.getContextPath() + _redirecturi; + fillUrl += URLEncoder.encode(tourl, "UTF-8"); +// "http://172.16.30.123:8081"+ SystemEnvironment.getContextPath() + _redirecturi + tourl, "UTF-8" +// ) + Constants._FIXURL; + result.put("fillUrl", fillUrl); + return result; + } catch (UnsupportedEncodingException e) { + log.error("地址处理异常", e); + } + } else if (sourceType == Enums.SourceType.SOURCE_TYPE_INFOMANAGE.getKey()) { + String formType = ParamUtil.getString(params, "formType"); + String type = ParamUtil.getString(params, "type"); + String title = ParamUtil.getString(params, "title"); + String moduleId = ParamUtil.getString(params, "moduleId"); + String formTemplateId = ParamUtil.getString(params, "formTemplateId"); + String moduleType = ParamUtil.getString(params, "moduleType"); + String operateType = ParamUtil.getString(params, "operateType"); + String rightId = ParamUtil.getString(params, "rightId"); + //http://127.0.0.1/seeyon/qrCodeForm.do?method=newMain&html=/seeyon/m3/apps/v5/cap4/htmls/native/form/index.html?cusType=true&formTemplateId=-4624141853295951831&moduleId=-4624141853295951831&moduleType=42&formType=main&type=new&operateType=0&rightId=-1 + String tourl = Constants.UNFLOW_URL + "cusType=true" + + "&formTemplateId=" + formTemplateId + + "&moduleId=" + moduleId + + "&moduleType=" + moduleType + + "&formType=" + formType + + "&type=" + type + + "&rightId=" + rightId + + "&operateType=" + operateType; + try { +// fillUrl = fillUrl + URLEncoder.encode( + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name()); + fillUrl = address + SystemEnvironment.getContextPath() + _redirecturi; + + fillUrl += URLEncoder.encode(tourl, "UTF-8"); +// "http://172.16.30.123:80"+ SystemEnvironment.getContextPath() + _redirecturi + tourl, "UTF-8" +// ) + Constants._FIXURL; + log.info("生成地址为:" + fillUrl); + result.put("fillUrl", fillUrl); + return result; + } catch (UnsupportedEncodingException e) { + log.error("地址处理异常", e); + } + } + return result; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java new file mode 100644 index 0000000..2cc5c6c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java @@ -0,0 +1,141 @@ +package com.seeyon.apps.qrCodeForm.sso; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.weixin.manager.WechatUserManager; +import com.seeyon.apps.weixin.po.WechatUser; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.portal.sso.SSOLoginContext; +import com.seeyon.ctp.portal.sso.SSOLoginHandshakeAbstract; +import com.seeyon.ctp.util.HttpClientUtil; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.Inject; +import org.apache.commons.logging.Log; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @author + * @title: WechatQRHandShake + * @description: 企业微信扫码发起单据 + * @date 2021/11/30 9:47 + */ +public class WechatQRHandShake extends SSOLoginHandshakeAbstract { + + private static final Log log = CtpLogFactory.getLog(WechatQRHandShake.class); + //企业微信appid + public static final String _CORPID = AppContext.getSystemProperty("qrCodeForm.corpid"); + //企业微信corpsecret + public static final String _corpsecret = AppContext.getSystemProperty("qrCodeForm.corpsecret"); + //验证方式 + public static final String handshakeType = AppContext.getSystemProperty("qrCodeForm.handshakeType"); + + @Inject + public WechatUserManager wechatUserManager; + @Autowired + private OrgManager orgManager; + @Override + public String handshake(String s) { + log.info("--进入企业微信回调接口!"); + HttpServletRequest request = AppContext.getRawRequest(); + String code =request.getParameter("code"); + + String corpid =_CORPID; + String corpsecret =_corpsecret; + + log.info("获取access接口url:https://qyapi.weixin.qq.com/cgi-bin/gettoken?"+"corpid="+corpid+"&corpsecret="+corpsecret); + String access = null; + try { + access = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret); + log.info("获取access接口返回:"+access); + if(access==null || access.equals("")){ + log.error("--未获取到access!"); + return null; + } + + JSONObject jsonObject = JSONObject.parseObject(access); + if(jsonObject==null){ + log.error("--未获取到access的jsonObject!"); + return null; + } + + String accessToken = (String)jsonObject.get("access_token"); + if(accessToken==null || accessToken.equals("")){ + log.error("--未获取到accessToken!"); + return null; + } + + log.info("--获取访问用户身份接口url:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?"+"access_token=" + accessToken + "&code=" + code); + String user = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + accessToken + "&code=" + code); + log.info("--获取访问用户身份接口返回值:" + user); + if(user==null || user.equals("")){ + log.error("--未获取到user!"); + return null; + } + + JSONObject userJson = JSONObject.parseObject(user); + if(userJson==null){ + log.error("--未获取到user的jsonObject!"); + return null; + } + + String userid = userJson.getString("UserId"); + if(userid==null || userid.equals("")){ + log.error("--未获取到userid!"); + return null; + } + String Loginname = null; +// if("1".equals(handshakeType)){//使用标准模块的微信绑定 + if(false){ //企业微信、微协同绑定等信息存储在微协同云服务中,废弃逻辑 + WechatUser wechatUser =wechatUserManager.getWechatUserByUserIdAndcorpId(userid,corpid); + Loginname=wechatUser.getXtLoginName(); + }else {//自定义如何根据微信得用户id获取OA的用户 + log.info("--获取成员接口url:https://qyapi.weixin.qq.com/cgi-bin/user/get?"+"access_token=" + accessToken + "&userid=" + userid); + String member = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&userid=" + userid); + log.info("获取成员接口返回值:" + member); + if(member==null || member.equals("")){ + log.error("--未获取到member!"); + return null; + } + + JSONObject memberJson = JSONObject.parseObject(member); + if(userJson==null){ + log.error("--未获取到member的jsonObject!"); + return null; + } + + String mobile = memberJson.getString("mobile"); + if(mobile==null || mobile.equals("")){ + log.error("--未获取到mobile!"); + return null; + } + List memberList=orgManager.getMemberListByMobile(mobile,null); + Loginname = memberList!=null?memberList.get(0).getLoginName():null; + } + if(Loginname ==null || Loginname.equals("")){ + log.error("--未获取到loginName!"); + return null; + } + return Loginname; + + } catch (Exception e) { + log.error("获取微信验证失败",e); + } + + return null; + } + + @Override + public void logoutNotify(String s) { + + } + + @Override + public String getToUrl(HttpServletRequest req, SSOLoginContext ssoLoginContext, String ticket) { + return req.getParameter("tourl"); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java new file mode 100644 index 0000000..2f4c7bc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java @@ -0,0 +1,117 @@ +package com.seeyon.apps.qrCodeForm.util; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.privilege.bo.PrivMenuBO; +import com.seeyon.ctp.privilege.enums.PrivMenuTypeEnums; +import com.seeyon.ctp.privilege.manager.PrivilegeMenuManager; +import com.seeyon.ctp.privilege.po.PrivMenu; +import com.seeyon.ctp.util.DBAgent; +import com.seeyon.ctp.util.DateUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class InitQrCodeFormUitl { + private static Log log = LogFactory.getLog(InitQrCodeFormUitl.class); + private static PrivilegeMenuManager privilegeMenuManager = (PrivilegeMenuManager) AppContext.getBean("privilegeMenuManager"); + + public static void initMenu() { + try { + List listmenu = new ArrayList(); + + StringBuffer queryString = new StringBuffer(" FROM "); + queryString.append(PrivMenu.class.getSimpleName()).append(" where ") + .append(" path = '711' "); + + listmenu = DBAgent.find(queryString.toString()); + if (listmenu == null || listmenu.size() < 1) { + creatFileImportMenu();//创建菜单资源 + } + log.info("模板二维码菜单完成"); + + } catch (Exception e) { + log.error("模板二维码菜单失败", e); + } + + } + + /** + * 配置菜单 + * + * @return + * @throws BusinessException + */ + private static void creatFileImportMenu() { + try { + List menus = new ArrayList(); + PrivMenu configmenu = new PrivMenu(); + configmenu.setNewId(); + configmenu.setName("模板二维码"); + configmenu.setIcon("conferencearrangemen.png"); + configmenu.setSortid(1); + configmenu.setPath("711"); + configmenu.setExt1("0"); + configmenu.setExt2("1"); + configmenu.setExt3(""); + configmenu.setExt4(1); + configmenu.setExt7(configmenu.getName()); + configmenu.setExt8(""); + configmenu.setExt9(""); + configmenu.setExt10(""); + configmenu.setExt11(""); + configmenu.setExt12(0); + configmenu.setExt13(0); + configmenu.setExt14(0); + configmenu.setExt15(0); + configmenu.setExt16(0); + Date nowDate = new Date(); + configmenu.setCreatedate(nowDate); + configmenu.setUpdatedate(nowDate); + configmenu.setType(PrivMenuTypeEnums.systemPresetMenu.getKey()); + configmenu.setParentId(0L); + menus.add(configmenu); + + PrivMenu syncConfig = new PrivMenu();//二维码生成 + syncConfig.setNewId(); + syncConfig.setName("二维码生成"); + syncConfig.setIcon("b_menu_thridpartyspace.png"); + syncConfig.setTarget("mainfrm"); + syncConfig.setSortid(1); + syncConfig.setPath("711001"); + syncConfig.setExt1("0"); + syncConfig.setExt2("2"); + syncConfig.setExt3(""); + syncConfig.setExt4(1); + syncConfig.setExt7(syncConfig.getName()); + syncConfig.setExt8("0"); + syncConfig.setExt9("0"); + syncConfig.setExt10("0"); + syncConfig.setExt11("1"); + syncConfig.setExt19(2L); + syncConfig.setEnterResource(1); + syncConfig.setResourceNavurl("/qrCodeForm.do?method=index"); + syncConfig.setResourceCode("qrCodeForm"); + syncConfig.setResourceModuleid("none"); + syncConfig.setCreatedate(nowDate); + syncConfig.setUpdatedate(nowDate); + syncConfig.setUpdateuserid(1L); + syncConfig.setShow(true); + syncConfig.setControl(true); + syncConfig.setType(PrivMenuTypeEnums.systemPresetMenu.getKey()); + syncConfig.setParentId(configmenu.getId()); + menus.add(syncConfig); + + DBAgent.saveAll(menus); + } catch (Exception e) { + log.error("组织机构同步菜单异常", e); + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java new file mode 100644 index 0000000..7bd8612 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/qrCodeForm/util/LoginUtil.java @@ -0,0 +1,71 @@ +package com.seeyon.apps.qrCodeForm.util; + +import cn.hutool.cache.CacheUtil; +import cn.hutool.cache.impl.TimedCache; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.constants.Constants; +import com.seeyon.ctp.rest.util.TokenUtil; +import com.seeyon.ctp.services.UserToken; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.TextEncoder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; + +public class LoginUtil { + private static Log log = LogFactory.getLog(LoginUtil.class); + + private static ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + private static TimedCache tokenCache = CacheUtil.newTimedCache(14 * 60 * 1000); + + //rest信息 +// public static final String restName = AppContext.getSystemProperty("qrCodeForm.restName"); +// public static final String restPassword = AppContext.getSystemProperty("qrCodeForm.restPassword"); + + + /** + * 获取token + * + * @param loginName 登录名 + * @return + */ + public static Map getToken(String memberId, String loginName, HttpServletRequest request, HttpServletResponse response) { + Map map = new HashMap(); + String tokenId = tokenCache.get(memberId); + if(null != tokenId) { + map.put("id", tokenId); + map.put("success", true); + return map; + } + try { + ConfigVo config = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId()); + String userName = config.getParamVal(QrCodeFormConstants.restId.name()); + String password = config.getParamVal(QrCodeFormConstants.restPwd.name()); + password = TextEncoder.decode(password); + Long userId = null; + if (Strings.isNotBlank(memberId)) { + userId = Long.parseLong(memberId); + } + UserToken token = TokenUtil._getToken(userName, password, userId, loginName, null, Constants.login_useragent_from.wechat.name(), request, response); + if (token != null) { + map.put("success", true); + map.put("id", token.getId()); + tokenCache.put(memberId, token.getId()); + } + } catch (Exception e) { + log.error("", e); + map.put("success", false); + map.put("message", e.getMessage()); + } + return map; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/ctrl/StartTaskController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/ctrl/StartTaskController.java new file mode 100644 index 0000000..bc1c484 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/ctrl/StartTaskController.java @@ -0,0 +1,122 @@ +package com.seeyon.apps.src_automatic.ctrl; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; + +import com.seeyon.apps.src_automatic.dao.IAutomaticDao; +import com.seeyon.apps.src_automatic.service.IAutomaticService; +import com.seeyon.apps.src_automatic.task.AutomaticTask; +//import com.seeyon.apps.src_automatic.task.PushAuCardTask; +import com.seeyon.ctp.common.AppContext; +//import com.seeyon.apps.src_automatic.util.ConfigKit; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.quartz.QuartzHolder; +import com.seeyon.ctp.util.annotation.NeedlessCheckLogin; + +/** + * Description + *
定时任务控制器
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class StartTaskController extends BaseController { + +// private PushZcService pushZcService; + private IAutomaticService automaticService; + + + + public IAutomaticService getAutomaticService() { + if (automaticService == null) { + automaticService = (IAutomaticService) AppContext.getBean("automaticService"); + } + return automaticService; } + + public void setAutomaticService(IAutomaticService automaticService) { + this.automaticService = automaticService; + } + + @NeedlessCheckLogin + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws IOException { +// 用于执行定时任务的开启和关闭 + String opera = request.getParameter("task"); + if("start".equals(opera)) { + String time; + try { +// time = ConfigKit.getTaskTime(); + time = automaticService.getTaskTime(); + } catch (Exception e) { + super.rendJavaScript(response, "alert('获取配置出错');"); + return null; + } + if(null == time) { + super.rendJavaScript(response, "alert('请正確配置nczc.properties中的taskTime参数,如果定时执行,启用D-开头,如D-03,15表示每天三点十五执行,如果间隔时间执行,请用I-开头,例如I-03,00表示每三个小时执行一次!');"); + return null; + } else if(time.startsWith("D-")) { + // D-开头,每天执行任务 + String[] arr = time.split("-"); + try { + Integer[] itime = getTime(arr); + AutomaticTask.registerSyncTask(false, itime[0], itime[1]); + super.rendJavaScript(response, "alert('任务注册成功,每天" + itime[0] + "点," + itime[1] + "分执行');"); + return null; + } catch (Exception e) { + super.rendJavaScript(response, "alert('" + e.getMessage() + "');"); + return null; + } + } else if(time.startsWith("I-")) { + // i-开头,是间隔时间执行 + String[] arr = time.split("-"); + try { + Integer[] itime = getTime(arr); + AutomaticTask.registerSyncTask(true, itime[0], itime[1]); + super.rendJavaScript(response, "alert('任务注册成功,间隔" + itime[0] + "小时," + itime[1] + "分钟执行');"); + return null; + } catch (Exception e) { + super.rendJavaScript(response, "alert('" + e.getMessage() + "');"); + return null; + } + } else { + super.rendJavaScript(response, "alert('请正確配置nczc.properties中的taskTime参数,如果定时执行,启用D-开头,如D-03,15表示每天三点十五执行,如果间隔时间执行,请用I-开头,例如I-03,00表示每三个小时执行一次!');"); + return null; + } + } else if("stop".equals(opera)){ + QuartzHolder.deleteQuartzJob(AutomaticTask.jobName); + super.rendJavaScript(response, "alert('定时推送短信定时任务已经终止!');"); + return null; + } else if("run".equals(opera)) { + String runall = request.getParameter("all"); +// String res = pushZcService.calcBudget("true".equals(runall)); +// super.rendJavaScript(response, "alert('推送资产任务执行完毕: " + res + "');"); + return null; + } else { + super.rendJavaScript(response, "alert('参数有误,请联系开发人员!');"); + return null; + } + } + + private Integer[] getTime(String[] arr) throws Exception { + String time = arr[1]; + arr = time.split(","); + if(arr.length != 2) { + throw new Exception("小时和分钟请用逗号隔开"); + } + int our = Integer.valueOf(arr[0]); + int minute = Integer.valueOf(arr[1]); + if(our < 0 || our >= 24) { + throw new Exception("小时数必须在0~24之间"); + } + if(minute < 0 || minute >= 60) { + throw new Exception("分钟数必须在0~60之间"); + } + return new Integer[] {our, minute}; + } + +// public void setPushZcService(PushZcService pushZcService) { +// this.pushZcService = pushZcService; +// } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/AutomaticDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/AutomaticDaoImpl.java new file mode 100644 index 0000000..0fc7a48 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/AutomaticDaoImpl.java @@ -0,0 +1,54 @@ +package com.seeyon.apps.src_automatic.dao; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.map.HashedMap; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +public class AutomaticDaoImpl implements IAutomaticDao { + + @Override + public List> getAutomaticTime() throws SQLException, BusinessException { + List> lists = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getAutomaticTime); +// StringBuilder sql = new StringBuilder("SELECT id FROM formmain_0536 WHERE field0013 = ? "); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + Object time = map.get("field0001"); + Object timingHour = map.get("field0002"); + Object timingMinute = map.get("field0003"); + Object intervalHour = map.get("field0004"); + Object intervalMinute = map.get("field0005"); + Map timeMap = new HashedMap(); + timeMap.put("time", time); + timeMap.put("timingHour", timingHour); + timeMap.put("timingMinute", timingMinute); + timeMap.put("intervalHour", intervalHour); + timeMap.put("intervalMinute", intervalMinute); + lists.add(timeMap); + } + }finally { + if (agent != null) { + agent.close(); + } + } + return lists; + + } + + +// private String getAutomaticTime = "SELECT field0001,field0002,field0003,field0004,field0005 FROM formmain_0185 "; + + private String getAutomaticTime = "SELECT field0001,field0002,field0003,field0004,field0005 FROM formmain_3048 "; + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/IAutomaticDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/IAutomaticDao.java new file mode 100644 index 0000000..edc0042 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/IAutomaticDao.java @@ -0,0 +1,18 @@ +package com.seeyon.apps.src_automatic.dao; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +import com.seeyon.ctp.common.exceptions.BusinessException; + +public interface IAutomaticDao { + + /** + * 查询无流程表单,通过表单中的控制设置完成对定时器的控制。 + * @return + * @throws SQLException + * @throws BusinessException + */ + public List> getAutomaticTime() throws SQLException, BusinessException; +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/ISendNoteMsgDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/ISendNoteMsgDao.java new file mode 100644 index 0000000..26d341e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/ISendNoteMsgDao.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.src_automatic.dao; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +import com.seeyon.ctp.common.exceptions.BusinessException; + +public interface ISendNoteMsgDao { + +// 获取需要发送短信的主表信息 + public List> findNoteByDate(String date) throws BusinessException, SQLException; + +// 获取需要发送短信的主表信息 + public List> findNotesByFormId(String date) throws BusinessException, SQLException; + +// 发送成功修改明细表中的发送状态为已发送 + public int updateNotesbySucceed(String result,String id) throws BusinessException, SQLException; + +// 发送失败修改明细表中的发送状态为发送失败并且补充失败原因 + public int updateNotesbyDefeated(String result,String desc,String id) throws BusinessException, SQLException; + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/SendNoteMsgDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/SendNoteMsgDaoImpl.java new file mode 100644 index 0000000..b894f3b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/dao/SendNoteMsgDaoImpl.java @@ -0,0 +1,119 @@ +package com.seeyon.apps.src_automatic.dao; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.map.HashedMap; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +public class SendNoteMsgDaoImpl implements ISendNoteMsgDao { + + @Override + public List> findNoteByDate(String date) throws BusinessException, SQLException { + List> lists = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(findNoteByDate); + List p = new ArrayList(); + p.add(date); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + for(int i = 0 ; i < list.size() ; i ++) { + lists.add(list.get(i)); + } + } + }finally { + if (agent != null) { + agent.close(); + } + } + return lists; + } + + @Override + public List> findNotesByFormId(String id) throws BusinessException, SQLException { + List> lists = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(findNotesByFormId); + List p = new ArrayList(); + p.add(id); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + for(int i = 0 ; i < list.size() ; i ++) { + Map map = new HashedMap(); + map.put("content", list.get(i).get("field0027")); + map.put("recipient", list.get(i).get("field0028")); + map.put("phone", list.get(i).get("field0029")); + map.put("id", list.get(i).get("id")); + lists.add(map); + } + } + }finally { + if (agent != null) { + agent.close(); + } + } + return lists; + } + + + @Override + public int updateNotesbySucceed(String result,String id) throws BusinessException, SQLException { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateNotesbySucceed); +// StringBuilder sql = new StringBuilder("update formmain_0536 set field0013 = ? where id=?"); + List p = new ArrayList(); + p.add(result); + p.add(id); + i=agent.execute(sql.toString(), p); + }finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + @Override + public int updateNotesbyDefeated(String result,String desc,String id) throws BusinessException, SQLException { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateNotesbyDefeated); +// StringBuilder sql = new StringBuilder("update formmain_0536 set field0013 = ? where id=?"); + List p = new ArrayList(); + p.add(result); + p.add(desc); + p.add(id); + i=agent.execute(sql.toString(), p); + }finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +//private String findNoteByDate = "select id,field0002 from formmain_0183 where start_date like ? and field0014 = '-7272450028438992115'"; +//private String findNotesByFormId = "select id,field0027,field0028,field0029 from formson_0184 where formmain_id = ? "; +//private String updateNotesbySucceed = "update formson_0184 set field0034 = ? where id=? "; +//private String updateNotesbyDefeated = "update formson_0184 set field0034 = ?,field0036 = ? where id=? "; + +private String findNoteByDate = "select id,field0002 from formmain_3045 where field0032 = to_date(?,'yyyy-mm-dd') and field0014 = '-658637500406938218'"; +private String findNotesByFormId = "select id,field0027,field0028,field0029 from formson_3046 where formmain_id = ?"; +private String updateNotesbySucceed = "update formson_3046 set field0034 = ? where id=? "; +private String updateNotesbyDefeated = "update formson_3046 set field0034 = ?,field0036 = ? where id=? "; + + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/service/AutomaticServiceImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/service/AutomaticServiceImpl.java new file mode 100644 index 0000000..274beaa --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/service/AutomaticServiceImpl.java @@ -0,0 +1,184 @@ +package com.seeyon.apps.src_automatic.service; + +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.lang.StringUtils; + +import com.seeyon.apps.src_automatic.dao.IAutomaticDao; +import com.seeyon.apps.src_automatic.dao.ISendNoteMsgDao; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.oainterface.impl.exportdata.MessageExporter; + +public class AutomaticServiceImpl implements IAutomaticService{ + + private IAutomaticDao automaticDao; + private EnumManager enumManagerNew; + private ISendNoteMsgDao sendNoteMsgDao; + private OrgManager orgManager; + + public OrgManager getOrgManager() { + if (this.orgManager == null) { + this.orgManager = ((OrgManager)AppContext.getBean("orgManager")); + } + return orgManager; + } + + public void setOrgManager(OrgManager orgManager) { + this.orgManager = orgManager; + } + + + public EnumManager getEnumManager() { + if (this.enumManagerNew == null) { + this.enumManagerNew = ((EnumManager)AppContext.getBean("enumManagerNew")); + } + return enumManagerNew; + } + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public ISendNoteMsgDao getSendNoteMsgDao() { + if (sendNoteMsgDao == null) { + sendNoteMsgDao = (ISendNoteMsgDao) AppContext.getBean("sendNoteMsgDao"); + } + return sendNoteMsgDao; + } + + public void setSendNoteMsgDao(ISendNoteMsgDao sendNoteMsgDao) { + this.sendNoteMsgDao = sendNoteMsgDao; + } + + public IAutomaticDao getAutomaticDao() { + if (automaticDao == null) { + automaticDao = (IAutomaticDao) AppContext.getBean("automaticDao"); + } + return automaticDao; + } + + public void setAutomaticDao(IAutomaticDao automaticDao) { + this.automaticDao = automaticDao; + } + + @Override + public String getTaskTime() { + List> lists; + String str = ""; + try { + lists = automaticDao.getAutomaticTime(); + + Map map; + if(lists.size()>0) { + map = lists.get(0); + }else { + return null; + } + StringBuffer stb = new StringBuffer(); + if("01".equals(enumManagerNew.getEnumItem(Long.parseLong(map.get("time").toString())).getValue())) { + stb.append("D-").append(map.get("timingHour")).append(",").append(map.get("timingMinute")); + }else if("02".equals(enumManagerNew.getEnumItem(Long.parseLong(map.get("time").toString())).getValue())){ + stb.append("I-").append(map.get("intervalHour")).append(",").append(map.get("intervalMinute")); + } + + str = stb.toString(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return str; + } + + @Override + public List> getSendNote(String date) { + List> lists = new ArrayList>(); + try { + List> ids = sendNoteMsgDao.findNoteByDate(date); + lists = ids; + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return lists; + } + + + + @Override + public List> getSendNotes(String id) { + List> lists = new ArrayList>(); + try { + List> maps = sendNoteMsgDao.findNotesByFormId(id); + lists = maps; + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return lists; + } + + @Override + public int updateNotes(String result, String desc, String id) { + int i = 0 ; + try { + if(desc==null) { + i =sendNoteMsgDao.updateNotesbySucceed(result, id); + }else { + i =sendNoteMsgDao.updateNotesbyDefeated(result, desc, id); + } + } catch (BusinessException | SQLException e) { + e.printStackTrace(); + } + return i; + } + + + /** + * //发送消息给指定人 + * @param content + */ + public void sendMsg(String content, Long msgMemberId){ + + MessageExporter messageExporter = new MessageExporter(); + try { +// String msgLoginName = "shenxian"; + V3xOrgMember orgMember = orgManager.getMemberById(msgMemberId); + String msgLoginName = orgMember.getLoginName(); + if(StringUtils.isNotEmpty(msgLoginName)){ + String[] m = {msgLoginName}; +// List list = new ArrayList(); +// list.add(msgLoginName); + messageExporter.sendMessage(-7273032013234748168l, m,content , null,null,null); + } + } catch (ServiceException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/service/IAutomaticService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/service/IAutomaticService.java new file mode 100644 index 0000000..36c3783 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/service/IAutomaticService.java @@ -0,0 +1,20 @@ +package com.seeyon.apps.src_automatic.service; + +import java.util.List; +import java.util.Map; + + +public interface IAutomaticService { + + public String getTaskTime(); + +// 获取需要发送短信的主表ID与相应的负责人ID + public List> getSendNote(String date); + + public List> getSendNotes(String id); + + public int updateNotes(String result,String desc,String id); + +// 发送消息你给指定人 + public void sendMsg(String content, Long msgMemberId); +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/task/AutomaticTask.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/task/AutomaticTask.java new file mode 100644 index 0000000..785556b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/task/AutomaticTask.java @@ -0,0 +1,181 @@ +package com.seeyon.apps.src_automatic.task; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_automatic.service.IAutomaticService; +import com.seeyon.apps.src_automatic.util.MoblieMsgUtil; +import com.seeyon.ctp.common.AppContext; +//import com.seeyon.apps.src_automatic.task.PushAuCardTask; +//import com.seeyon.apps.src_bill_detail.manager.PushZcService; +import com.seeyon.ctp.common.quartz.QuartzHolder; +import com.seeyon.ctp.common.quartz.QuartzJob; +import com.seeyon.ctp.util.SDFCoder; +import com.seeyon.ctp.util.UUIDLong; +import com.seeyon.ctp.util.json.JSONUtil; + +/** + * 自动计算任务 + */ +public class AutomaticTask implements QuartzJob { + + /** 日志管理器 */ + private final static Log log = LogFactory.getLog(AutomaticTask.class); + + /** 定义的任务插件ID */ +// private static String jobBeanId="pushCardTask"; + + /** 定义的任务名称 */ +// public static String jobName="QuartzPushCardTask"; + + /** 定义的任务插件ID */ + private static String jobBeanId="automaticTask"; + + /** 定义的任务名称 */ + public static String jobName="QuartzAutomaticTask"; + +// private PushZcService pushZcService; + + private volatile boolean running; + +private IAutomaticService automaticService; + + public IAutomaticService getAutomaticService() { + if (automaticService == null) { + automaticService = (IAutomaticService) AppContext.getBean("automaticService"); + } + return automaticService; + } + + public void setAutomaticService(IAutomaticService automaticService) { + this.automaticService = automaticService; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute(Map parameters) { + if(running) { + log.info("上次推送还在执行中,跳过本次数据推送"); + return; + } + try { + SimpleDateFormat sdfTest = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:sss"); + System.out.println(sdfTest.format(new Date())); + this.running = true; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + String dateStr = sdf.format(date); +// 获取需要发送短信的主表id + List> datas = automaticService.getSendNote(dateStr); + for (Map maps : datas) { +// 根据主表id获取需要发送的短信数据 + List> lists= automaticService.getSendNotes(maps.get("id").toString()); + int succeed = 0; + int defeated = 0; +// int i = 1 ; + for (Map map : lists) { +// System.out.println("给"+map.get("recipient")+"发短信,电话号码是:"+map.get("phone")+",需要发送的类容:“"+map.get("content")+"”"); + if(map.get("phone")!=null) { + String[] phones = map.get("phone").toString().split(","); + int defeatedNum = 0; +// 去除手机号重复 + List list = new ArrayList(); + for (int i = 0; i < phones.length; i++) { + if (!list.contains(phones[i])) { + list.add(phones[i]); + } + } + phones = list.toArray(new String[list.size()]); + for (String phone : phones) { + if(phone.length()>0) { +// 调用发送短信 + String res = MoblieMsgUtil.sendMsg(phone, UUIDLong.longUUID() + "", map.get("content").toString()); + JSONObject json = JSONUtil.parseJSONString(res, JSONObject.class); +// 处理返回值 + int codeint = json.getIntValue("result"); + if(codeint == 0) { +// 发送成功 + succeed++; + if(defeatedNum<0) { + automaticService.updateNotes(codeint+"", null, map.get("id").toString()); + } +// sb.append("短信发送成功:" + map.get("phone").toString() + ","); + } else { +// 发送失败 + defeated++;defeatedNum++; + automaticService.updateNotes(codeint+"", json.getString("desc"), map.get("id").toString()); +// sb.append(json.getString("desc") + ","); + } + } + } + } + } + String content; + if(defeated==0){ + content = "总共发送短信"+succeed+"条,成功"+succeed+"条。"; + }else { + content = "总共发送短信"+(succeed+defeated)+"条,成功"+succeed+"条,失败"+defeated+"条,失败原因请查看日消息通知列表"; + } + if(maps.get("field0002")!=null) { + automaticService.sendMsg(content, Long.valueOf(maps.get("field0002").toString())); + } + } +// pushZcService.calcBudget(false); + } catch(Exception e) { + log.error("循环发送短信发生异常:", e); + } finally { + this.running = false; + } + } + + /** + * interval 如果是true,则是间隔执行 + */ + public static void registerSyncTask(boolean interval, int our, int minute) { +// jobBeanId = "pushCardTask"; +// jobName = "QuartzPushCardTask"; + jobBeanId = "automaticTask"; + jobName = "QuartzAutomaticTask"; + log.info("注册预算定时计算任务" + jobName + "..."); + try { + // 先删除任务 + QuartzHolder.deleteQuartzJob(jobName); + // 设定时间 每天同步的 + // if ("aa".length() > 5) { + if(interval) { + int delta = (our * 60 + minute) * 60 * 1000; + Map parameters = new HashMap(); + QuartzHolder.newQuartzJob(jobName, new Date(), delta, jobBeanId, parameters); + } else { + Map parameters = new HashMap(); + // 设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); // 年月日 也可以具体到时分秒如calendar.set(2015, 10, 12,11,32,52); + // 每日运行,只要改动 时间即可 + calendar.set(Calendar.HOUR_OF_DAY, our); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, 00); + Date date = calendar.getTime();// date就是你需要的时间 + QuartzHolder.newQuartzJobPerDay(null, jobName, date, jobBeanId, parameters); + log.info("注册短信推送定时计算任务" + jobName + ",成功"); + } + } catch (Exception e) { + log.error("注册预算定时计算任务失败", e); + } + } + +// public void setPushZcService(PushZcService pushZcService) { +// this.pushZcService = pushZcService; +// } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/test/SendTest.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/test/SendTest.java new file mode 100644 index 0000000..203997c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/test/SendTest.java @@ -0,0 +1,117 @@ +package com.seeyon.apps.src_automatic.test; + + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.web.servlet.ModelAndView; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_automatic.service.IAutomaticService; +import com.seeyon.apps.src_automatic.util.MoblieMsgUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.util.UUIDLong; +import com.seeyon.ctp.util.json.JSONUtil; + +public class SendTest extends BaseController{ + + private static final Log log = LogFactory.getLog(SendTest.class); + + private IAutomaticService automaticService; + + public IAutomaticService getAutomaticService() { + if (automaticService == null) { + automaticService = (IAutomaticService) AppContext.getBean("automaticService"); + } + return automaticService; + } + + public void setAutomaticService(IAutomaticService automaticService) { + this.automaticService = automaticService; + } + + + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception { +// StringBuffer sb = new StringBuffer(); +// String mode = "0"; + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + String dateStr = sdf.format(date); +// 获取需要发送短信的主表id +// System.out.println(dateStr); + List> datas = automaticService.getSendNote(dateStr); + for (Map maps : datas) { +// 根据主表id获取需要发送的短信数据 + List> lists= automaticService.getSendNotes(maps.get("id").toString()); + int succeed = 0; + int defeated = 0; +// int i = 1 ; + for (Map map : lists) { +// System.out.println("给"+map.get("recipient")+"发短信,电话号码是:"+map.get("phone")+",需要发送的类容:“"+map.get("content")+"”"); + if(map.get("phone")!=null) { +// System.out.println(map.get("phone")); + String[] phones = map.get("phone").toString().split(","); +// 去除手机号重复 + List list = new ArrayList(); + for (int i = 0; i < phones.length; i++) { + if (!list.contains(phones[i])) { + list.add(phones[i]); + } + } + phones = list.toArray(new String[list.size()]); + int defeatedNum = 0; + for (String phone : phones) { + if(phone.length()>0) { +// 调用发送短信 + String res = MoblieMsgUtil.sendMsg(phone, UUIDLong.longUUID() + "", map.get("content").toString()); +// System.out.println(res); + JSONObject json = JSONUtil.parseJSONString(res, JSONObject.class); +// 处理返回值 + int codeint = json.getIntValue("result"); + if(codeint == 0) { +// 发送成功 + succeed++; + if(defeatedNum<0) { + int in=automaticService.updateNotes(codeint+"", null, map.get("id").toString()); + } +// sb.append("短信发送成功:" + map.get("phone").toString() + ","); + } else { +// 发送失败 + defeated++;defeatedNum++; + int in = automaticService.updateNotes(codeint+"", json.getString("desc"), map.get("id").toString()); +// sb.append(json.getString("desc") + ","); + } + } + } + } + } + String content; + if(defeated==0){ + content = "总共发送短信"+succeed+"条,成功"+succeed+"条。"; + }else { + content = "总共发送短信"+(succeed+defeated)+"条,成功"+succeed+"条,失败"+defeated+"条,失败原因请查看日消息通知列表"; + } +// System.out.println(content); + automaticService.sendMsg(content, Long.valueOf(maps.get("field0002").toString())); + } + + }catch (Exception e) { + log.error("循环发送短信发生异常:", e); + } + return null; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/A8FolderKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/A8FolderKit.java new file mode 100644 index 0000000..507d3ff --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/A8FolderKit.java @@ -0,0 +1,26 @@ +package com.seeyon.apps.src_automatic.util; + +import com.seeyon.ctp.common.SystemEnvironment; + +/** + * Description + *
获取A8产品下面的文件夹路径
+ */ +public class A8FolderKit { + + private static String A8_APPLICAION_FLODER = ""; + + /** + * Description: + *
获取到A8的安装模目录,ApacheJetspeed目录的父目录
+ * @return + */ + public static String getApplicationFolder() { + if("".equals(A8_APPLICAION_FLODER)) { + String installPath = SystemEnvironment.getApplicationFolder(); + A8_APPLICAION_FLODER = installPath.split("ApacheJetspeed")[0].replaceAll("\\\\", "/"); + } + return A8_APPLICAION_FLODER; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/ConfigKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/ConfigKit.java new file mode 100644 index 0000000..4f636db --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/ConfigKit.java @@ -0,0 +1,88 @@ +package com.seeyon.apps.src_automatic.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; + +import com.seeyon.apps.yonfintech.util.PropertiesUtil; + + + +//import com.seeyon.ctp.util.PropertiesUtil; + +public class ConfigKit { + + private static Long lastModify; + + private static String serviceUrl; + + private static String taskTime; + + private static String deptNo; + + public static synchronized String getServiceUrl() throws IOException { + // 判断文件更新时间 + File f = new File(A8FolderKit.getApplicationFolder() + "ApacheJetspeed/webapps/seeyon/WEB-INF/cfgHome/plugin/nczc/nczc.properties"); + if(null == lastModify || lastModify.longValue() != f.lastModified()) { + lastModify = f.lastModified(); + /** + * huangzhengguo + * 2022-10-09 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile(f); + /** + * end + */ + serviceUrl = prop.getProperty("serviceUrl"); + taskTime = prop.getProperty("taskTime"); + } + return serviceUrl; + } + + public static synchronized String getTaskTime() throws IOException { + // 判断文件更新时间 + File f = new File(A8FolderKit.getApplicationFolder() + "ApacheJetspeed/webapps/seeyon/WEB-INF/cfgHome/plugin/src_automatic/nczc.properties"); + if(null == lastModify || lastModify.longValue() != f.lastModified()) { + lastModify = f.lastModified(); + /** + * huangzhengguo + * 2022-10-09 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + serviceUrl = prop.getProperty("serviceUrl"); + taskTime = prop.getProperty("taskTime"); + } + return taskTime; + } + + public static synchronized String getDeptNo() throws IOException { + // 判断文件更新时间 + File f = new File(A8FolderKit.getApplicationFolder() + "ApacheJetspeed/webapps/seeyon/WEB-INF/cfgHome/plugin/nczc/nczc.properties"); + if(null == lastModify || lastModify.longValue() != f.lastModified()) { + lastModify = f.lastModified(); + /** + * huangzhengguo + * 2022-10-09 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + serviceUrl = prop.getProperty("serviceUrl"); + taskTime = prop.getProperty("taskTime"); + deptNo = prop.getProperty("deptNo"); + } + return deptNo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/EnumUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/EnumUtils.java new file mode 100644 index 0000000..72acb4a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/EnumUtils.java @@ -0,0 +1,178 @@ +package com.seeyon.apps.src_automatic.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.seeyon.apps.src_automatic.util.EnumUtils; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; + +/** + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class EnumUtils { + + private static final Log LOGGER = CtpLogFactory.getLog(EnumUtils.class); + + /** 枚举-枚举项 映射Map */ + private static Map> enumMap = new HashMap>(); + + /** 单位所有枚举 */ + private static List ctpEnumList; + + /** 枚举管理 */ + private static EnumManager enumManager = (EnumManager)AppContext.getBean("enumManagerNew"); + + /** + * 根据枚举ID 获取枚举key + * @param enumItemId 枚举ID + * @return 枚举显示值 + */ + public static String getEnumItemKey(Long enumItemId) throws BusinessException { + CtpEnumItem item = enumManager.getEnumItem(enumItemId); + if(null != item) { + return item.getValue(); + } + LOGGER.info("没有获取到枚举:" + enumItemId); + return ""; + } + + /** + * 根据枚举ID 获取枚举显示值 + * @param enumItemId 枚举ID + * @return 枚举显示值 + */ + public static String getEnumItemName(String enumItemId) { + if(null == enumItemId || "".equals(enumItemId)) { + return ""; + } + String enumItemName = ""; + try { + enumItemName = enumManager.getEItemNameById(Long.valueOf(enumItemId)); + } catch(BusinessException e) { + LOGGER.error("获取枚举错误:", e); + } + return enumItemName; + } + + /** + * 根据枚举类型名及枚举显示值 获取枚举项的ID + * @param enumTypeName 枚举类型名 + * @param enumItemName 枚举值 + * @return 枚举ID + * @throws Exception 异常 + */ + public static Long getEnumItemId(String enumTypeName, String enumItemName) { + try { + // 查询单位所有枚举 + ctpEnumList = enumManager.getAllOrgCtpEnum(); + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + if(!enumMap.containsKey(enumBean.getId())) { + enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId())); + } + for(CtpEnumItem item : enumMap.get(enumBean.getId())) { + if(enumItemName.equals(item.getShowvalue())) { + return item.getId(); + } + } + } + } + String errorInfo = "枚举类型:" + enumTypeName + "下面没有枚举值为[" + enumItemName + "] 的选项"; + throw new Exception(errorInfo); + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + } + // 先解决一个BUG,返回空的话查询出错 + return 0L; + } + + public static String getEnumItemkey(String enumTypeName, String enumItemName) { + try { + // 查询单位所有枚举 + ctpEnumList = enumManager.getAllOrgCtpEnum(); + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + if(!enumMap.containsKey(enumBean.getId())) { + enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId())); + } + for(CtpEnumItem item : enumMap.get(enumBean.getId())) { + if(enumItemName.equals(item.getShowvalue())) { + return item.getValue(); + } + } + } + } + String errorInfo = "枚举类型:" + enumTypeName + "下面没有枚举值为[" + enumItemName + "] 的选项"; + throw new Exception(errorInfo); + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + } + // 先解决一个BUG,返回空的话查询出错 + return ""; + } + + /** + * 根据枚举类型名获取枚举 + * @param enumTypeName 枚举类型名 + * @return 枚举ID + * @throws Exception 异常 + */ + public static List getEnumItemId(String enumTypeName) { + try { + // 查询单位所有枚举 + ctpEnumList = enumManager.getAllOrgCtpEnum(); + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + return enumManager.getEmumItemByEmumId(enumBean.getId()); + } + } + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + } + // 先解决一个BUG,返回空的话查询出错 + return null; + } + + + /** + * 根据枚举类型名及枚举值 获取枚举项的ID + * @param enumTypeName 枚举类型名 + * @param enumItemName 枚举值 + * @return 枚举ID + * @throws Exception 异常 + */ + public static String getEnumItemIdByKey(String enumTypeName, String enumItemKey) { + try { + // 查询单位所有枚举 + // if(ctpEnumList == null) { + ctpEnumList = enumManager.getAllOrgCtpEnum(); + // } + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + if(!enumMap.containsKey(enumBean.getId())) { + enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId())); + } + for(CtpEnumItem item : enumMap.get(enumBean.getId())) { + if(enumItemKey.equals(item.getValue())) { + return String.valueOf(item.getId()); + } + } + } + } + String errorInfo = "枚举类型:" + enumTypeName + "下面没有枚举值为[" + enumItemKey + "] 的选项"; + throw new Exception(errorInfo); + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + + } + return null; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/HttpKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/HttpKit.java new file mode 100644 index 0000000..25691f3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/HttpKit.java @@ -0,0 +1,136 @@ +package com.seeyon.apps.src_automatic.util; + +import java.util.ArrayList; +import java.util.Map; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +public class HttpKit { + private static PoolingHttpClientConnectionManager cm; + private static String EMPTY_STR = ""; + + private static void init() { + if (cm == null) { + cm = new PoolingHttpClientConnectionManager(); + cm.setMaxTotal(50);// 整个连接池最大连接数 + cm.setDefaultMaxPerRoute(5);// 每路由最大连接数,默认值是2 + } + } + + /** + * 通过连接池获取HttpClient + */ + private static CloseableHttpClient getHttpClient() { + init(); + return HttpClients.custom().setConnectionManager(cm).build(); + } + + public static String get(String url) throws Exception { + HttpGet httpGet = new HttpGet(url); + return getResult(httpGet); + } + + public static String get(String url, Map params) throws Exception { + URIBuilder ub = new URIBuilder(); + ub.setPath(url); + + ArrayList pairs = covertParams2NVPS(params); + ub.setParameters(pairs); + + HttpGet httpGet = new HttpGet(ub.build()); + return getResult(httpGet); + } + + public static String get(String url, Map headers, Map params) throws Exception { + URIBuilder ub = new URIBuilder(); + ub.setPath(url); + + ArrayList pairs = covertParams2NVPS(params); + ub.setParameters(pairs); + + HttpGet httpGet = new HttpGet(ub.build()); + for (Map.Entry param : headers.entrySet()) { + httpGet.addHeader(param.getKey(), String.valueOf(param.getValue())); + } + return getResult(httpGet); + } + + public static String post(String url) throws Exception { + HttpPost httpPost = new HttpPost(url); + return getResult(httpPost); + } + + public static String post(String url, Map params) throws Exception { + HttpPost httpPost = new HttpPost(url); + ArrayList pairs = covertParams2NVPS(params); + httpPost.setEntity(new UrlEncodedFormEntity(pairs, "UTF-8")); + return getResult(httpPost); + } + + public static String post(String url, String json) throws Exception { + HttpPost httpPost = new HttpPost(url); + StringEntity entity = new StringEntity(json, "UTF-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + return getResult(httpPost); + + } + + public static String post(String url, Map headers, Map params) throws Exception { + HttpPost httpPost = new HttpPost(url); + + for (Map.Entry param : headers.entrySet()) { + httpPost.addHeader(param.getKey(), String.valueOf(param.getValue())); + } + + ArrayList pairs = covertParams2NVPS(params); + httpPost.setEntity(new UrlEncodedFormEntity(pairs, "UTF_8")); + + return getResult(httpPost); + } + + private static ArrayList covertParams2NVPS(Map params) { + ArrayList pairs = new ArrayList(); + for (Map.Entry param : params.entrySet()) { + pairs.add(new BasicNameValuePair(param.getKey(), String + .valueOf(param.getValue()))); + } + + return pairs; + } + + /** + * 处理Http请求 + * + * @param request + * @return + */ + private static String getResult(HttpRequestBase request) throws Exception{ + // CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpClient httpClient = getHttpClient(); + CloseableHttpResponse response = httpClient.execute(request); + // response.getStatusLine().getStatusCode(); + HttpEntity entity = response.getEntity(); + if (entity != null) { + // long len = entity.getContentLength();// -1 表示长度未知 + String result = EntityUtils.toString(entity); + response.close(); + // httpClient.close(); + return result; + } + return EMPTY_STR; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/MoblieMsgUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/MoblieMsgUtil.java new file mode 100644 index 0000000..668abd1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/MoblieMsgUtil.java @@ -0,0 +1,55 @@ +package com.seeyon.apps.src_automatic.util; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import www.seeyon.com.utils.MD5Util; + +/** + * Description + *

+ * Date 2020年12月3日 下午9:00:27
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class MoblieMsgUtil { + + public static String sendMsg(String phone, String id, String content) throws Exception { + Map params = new HashMap<>(); + String url = PropKit.getProp(PropKit.URL); +// String url = "http://120.55.193.51:8098/smtp/http/submit"; + String userName = PropKit.getProp(PropKit.USER_NAME); +// String userName = "ycjyjtgs"; +// String serviceCode = "ycjyjtgs"; + String timestamp = System.currentTimeMillis() + ""; + String serviceCode = PropKit.getProp(PropKit.SERVICE_CODE); + String priority = "5"; + String encoding = "utf-8"; + String reportFlag = "0"; + String sign = getSign(timestamp); + params.put("timestamp", timestamp); + params.put("userName", userName); + params.put("serviceCode", serviceCode); + params.put("priority", priority); + params.put("encoding", encoding); + params.put("reportFlag", reportFlag); + params.put("sign", sign); + params.put("phones", phone); + params.put("mhtMsgIds", id); + params.put("msgContent", content); + String res = HttpKit.post(url, params); + return res; + } + + private static String getSign(String timestamp) throws FileNotFoundException, IOException { + String sign = PropKit.getProp(PropKit.USER_PASSWORD) + timestamp; +// String sign = "qRJmZ5fL3AI7" + timestamp; + return MD5Util.MD5(sign).toUpperCase(); + } + + public static void main(String[] args) throws Exception { +// System.out.println(System.currentTimeMillis()); + sendMsg("18164170159", "264", "这是一条测试短信"); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/PropKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/PropKit.java new file mode 100644 index 0000000..24cb491 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/PropKit.java @@ -0,0 +1,61 @@ +package com.seeyon.apps.src_automatic.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +import com.seeyon.ctp.common.SystemEnvironment; +//import com.seeyon.ctp.common.file.model.CtpLocalFile; +import com.seeyon.ctp.util.PropertiesUtil; + +/** + * 读取参数 + */ + +public class PropKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + + public static final String URL = "url"; + + public static final String SERVICE_CODE = "serviceCode"; + + public static final String USER_NAME = "userName"; + + public static final String USER_PASSWORD = "userPassword"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_automatic/mobile.properties"); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + for(Object propkey : prop.keySet()) { + props.put(propkey.toString(), prop.getProperty(key)); + } + } + return props.get(key); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/SoapContent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/SoapContent.java new file mode 100644 index 0000000..07eaa23 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/SoapContent.java @@ -0,0 +1,53 @@ +package com.seeyon.apps.src_automatic.util; + +/** + * 生成soap xml + */ +public class SoapContent { + + // 增加客商 + public static final String addCustomer = "addCustomer"; + // 资产增加 + public static final String cardAdd = "cardAdd"; + + // 资产变更 + public static final String cardAlter = "cardAlter"; + + // 资产减少 + public static final String cardReduce = "cardReduce"; + + // 收款结算 + public static final String fkjs = "addFkjsvo"; + + /** + * + + + + + ? + + + + */ + + public static String getSoapXml(String method, String body) { + StringBuffer soapXml = new StringBuffer(); + soapXml.append(""); + soapXml.append(""); + soapXml.append(""); + soapXml.append(""); + soapXml.append(""); + soapXml.append(""); + soapXml.append(""); + soapXml.append(""); + return soapXml.toString(); + } + + public static void main(String[] args) { + String body = "{\"bill_head\":[{\"card_code\":\"0000000933\",\"paydept_flag\":\"0\",\"reason\":\"ces \",\"recorder\":\"NCTEST\",\"bill_code\":\"JS2020090007\",\"source\":\"seeyon\",\"recorddate\":\"2020-09-04\",\"fk_mandept\":\"0403\",\"fk_usedept\":\"0307\",\"asset_code\":\"090182\",\"reducereason\":\"JTTZ09\",\"company\":\"201\",\"newcompany\":\"203\"}]}"; + System.out.println(getSoapXml(cardAlter, body)); + + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/WebServiceUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/WebServiceUtil.java new file mode 100644 index 0000000..f39946d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_automatic/util/WebServiceUtil.java @@ -0,0 +1,69 @@ +package com.seeyon.apps.src_automatic.util; + +import java.nio.charset.Charset; + +import org.apache.http.HttpEntity; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; + +public class WebServiceUtil { + + public static String invoke(String postUrl, String soapXml, String action) throws Exception { + // 创建HttpClientBuilder + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + // HttpClient + CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); + HttpPost httpPost = new HttpPost(postUrl); + // 设置请求和传输超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(60000) + .setConnectTimeout(60000).build(); + httpPost.setConfig(requestConfig); + CloseableHttpResponse response = null; + String retStr; + try { + httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8"); + httpPost.setHeader("SOAPAction", action); + StringEntity data = new StringEntity(soapXml.toString(), + Charset.forName("UTF-8")); + httpPost.setEntity(data); + response = closeableHttpClient + .execute(httpPost); + HttpEntity httpEntity = response.getEntity(); + if (httpEntity != null) { + // 打印响应内容 + retStr = EntityUtils.toString(httpEntity, "UTF-8"); + try { + Document doc = DocumentHelper.parseText(retStr); + retStr = doc.getRootElement().getStringValue(); + } catch (Exception e) { + throw new Exception("解析xml报文失败:" + (retStr.length() > 50 ? retStr.substring(0,50) : retStr)); + } + return retStr; + } else { + throw new Exception("未获取到数据!"); + } + } catch(Exception e) { + throw e; + } finally { + try { + // 释放资源 + if(null != response) { + response.close(); + } + if(null != closeableHttpClient) { + closeableHttpClient.close(); + } + } catch(Exception e) {} + } + + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/constants/ContractConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/constants/ContractConstants.java new file mode 100644 index 0000000..efa2c9a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/constants/ContractConstants.java @@ -0,0 +1,28 @@ +package com.seeyon.apps.src_contract.lease.constants; + +public enum ContractConstants { + + plugin("src_contract","插件ID"); + + ContractConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/dao/ILeaseContractDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/dao/ILeaseContractDao.java new file mode 100644 index 0000000..d6ddc19 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/dao/ILeaseContractDao.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_contract.lease.dao; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +import com.seeyon.ctp.common.exceptions.BusinessException; + +public interface ILeaseContractDao { + + /** + * 删除主表辅助租金计算表数据 + * @param contractCode + * @return + * @throws SQLException + * @throws BusinessException + */ + public int daleteFZLease(String contractCode) throws BusinessException, SQLException; + + /** + * 删除主表辅助租金计算表数据 + * @param contractCode + * @return + * @throws SQLException + * @throws BusinessException + */ + public int daleteFZLeaseSub(String contractCode) throws BusinessException, SQLException; + + /** + * 删除主表辅助租金计算表数据 + * @param contractCode + * @return + * @throws SQLException + * @throws BusinessException + */ + public List> historyPayment(String contractCode); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/dao/LeaseContractDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/dao/LeaseContractDaoImpl.java new file mode 100644 index 0000000..5d986c5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/dao/LeaseContractDaoImpl.java @@ -0,0 +1,111 @@ +package com.seeyon.apps.src_contract.lease.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.seeyon.apps.src_contract.lease.util.BaseUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +public class LeaseContractDaoImpl extends BaseUtil implements ILeaseContractDao { + +// private String historyPayment = "select * from bipZS01.FCT_RECEIVEPLAN_VIEW where CONTRACTCODE = '${CONTRACTCODE1}' and ENDDATE<=(select max(ENDDATE) as ENDDATE from bipZS01.FCT_RECEIVEPLAN_VIEW where CONTRACTCODE = '${CONTRACTCODE2}' and RECEIVETOTALCOST != 0)"; +// +// private String daleteFZLease = "delete from FORMMAIN_3618 WHERE FIELD0001 = ?"; +// private String daleteFZLeaseSub = "delete from FORMSON_3619 WHERE FORMMAIN_ID in (SELECT ID FROM FORMMAIN_3618 WHERE FIELD0001 = ? )"; +// private String daleteFZLease = "delete from formmain_0046 WHERE FIELD0001 = ?"; +// private String daleteFZLeaseSub = "delete from FORMSON_0047 WHERE FORMMAIN_ID in (SELECT ID FROM formmain_0046 WHERE FIELD0001 = ? )"; + + private String historyPayment = "select * from NCCDATA.FCT_RECEIVEPLAN_VIEW where CONTRACTCODE = '${CONTRACTCODE1}' and ENDDATE<=(select max(ENDDATE) as ENDDATE from NCCDATA.FCT_RECEIVEPLAN_VIEW where CONTRACTCODE = '${CONTRACTCODE2}' and RECEIVETOTALCOST != 0)"; + + private String daleteFZLease = "delete from FORMMAIN_3710 WHERE FIELD0001 = ?"; + private String daleteFZLeaseSub = "delete from FORMSON_3711 WHERE FORMMAIN_ID in (SELECT ID FROM FORMMAIN_3710 WHERE FIELD0001 = ? )"; + + + @Override + public int daleteFZLease(String contractCode) throws BusinessException, SQLException { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(daleteFZLease); + List p = new ArrayList(); + p.add(contractCode); + i=agent.execute(sql.toString(), p); + }finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + @Override + public int daleteFZLeaseSub(String contractCode) throws BusinessException, SQLException { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(daleteFZLeaseSub); +// StringBuilder sql = new StringBuilder("delete from formmain_0536 where id=?"); + List p = new ArrayList(); + p.add(contractCode); + i=agent.execute(sql.toString(), p); + }finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + @Override + public List> historyPayment(String contractCode) { + List> lists = new ArrayList>(); + String sql = historyPayment; + sql = sql.replace("${CONTRACTCODE1}", contractCode); + sql = sql.replace("${CONTRACTCODE2}", contractCode); + System.out.println(sql); + Object[] params = new Object[] {}; + ResultSet rs = super.executeQuery(sql, params); + try { + while (rs.next()) { + Map map = new HashMap(); +// map.put("CONTRACTCODE", rs.getString("CONTRACTCODE")); + map.put("STARTDATE", rs.getString("STARTDATE")); + map.put("ENDDATE", rs.getString("ENDDATE")); + + map.put("PLANENDDATE", rs.getString("PLANENDDATE")); + map.put("PLANTOTALCOST", rs.getString("PLANTOTALCOST")); + map.put("PLANRENTFEE", rs.getString("PLANRENTFEE")); + map.put("PLANMANAGEFEE", rs.getString("PLANMANAGEFEE")); + + map.put("DETAILTOTALCOST", rs.getString("DETAILTOTALCOST")); + map.put("DETAILRENT", rs.getString("DETAILRENT")); + map.put("DETAILMANAGESERVICEFEE", rs.getString("DETAILMANAGESERVICEFEE")); + map.put("DETAILMARKETFEE", rs.getString("DETAILMARKETFEE")); + + map.put("DERATETOTALCOST", rs.getString("DERATETOTALCOST")); + map.put("DERATERENT", rs.getString("DERATERENT")); + map.put("DERATEMANAGESERVICEFEE", rs.getString("DERATEMANAGESERVICEFEE")); + map.put("DERATEMARKETFEE", rs.getString("DERATEMARKETFEE")); + + map.put("INCREASETOTALCOST", rs.getString("INCREASETOTALCOST")); + map.put("INCREASERENT", rs.getString("INCREASERENT")); + map.put("INCREASEMANAGESERVICEFEE", rs.getString("INCREASEMANAGESERVICEFEE")); + map.put("INCREASEMARKETFEE", rs.getString("INCREASEMARKETFEE")); + + map.put("RECEIVETOTALCOST", rs.getString("RECEIVETOTALCOST")); + map.put("REMAINTOTALCOST", rs.getString("REMAINTOTALCOST")); + System.out.println(map); + lists.add(map); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + super.close(); + } + return lists; + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/fieldCtrl/ContractFieldCtrl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/fieldCtrl/ContractFieldCtrl.java new file mode 100644 index 0000000..3e04019 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/fieldCtrl/ContractFieldCtrl.java @@ -0,0 +1,86 @@ +package com.seeyon.apps.src_contract.lease.fieldCtrl; + +import java.util.List; + +import com.seeyon.cap4.form.bean.ParamDefinition; +import com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl; +import com.seeyon.cap4.form.util.Enums.ParamType; + +import www.seeyon.com.utils.UUIDUtil; + +/** + *
+ * 自定义控件:调用接口
+ * 
+ */ +public class ContractFieldCtrl extends FormFieldCustomCtrl { + + /** + * UUIDLong.longUUID() + * UUIDUtil.getUUIDString() + */ + public String getKey() { + return "6781318301073396375"; + } + + public static void main(String[] args) { + System.out.println(UUIDUtil.getUUIDLong()); + } + + public String getFieldLength() { + return "20"; + } + + /** + * 控件初始化接口,此接口在控件初始化的时候,会调用,主要用于定义控件所属插件id、在表单编辑器中的图标、表单编辑器中有哪些属性可以设置。 + * 使用举例:在接口中定义自定义控件在在表单编辑器中有哪些控件属性需要配置 + */ + public void init() { + setPluginId("contract"); + setIcon("cap-icon-querystatistics"); + // 自定义参数 + ParamDefinition templateIdParam = new ParamDefinition(); + templateIdParam.setParamType(ParamType.button); + addDefinition(templateIdParam); + } + + /** (non-Javadoc) + * @see com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl#getPCInjectionInfo() + * PC端的资源文件路径 + */ + public String getPCInjectionInfo() { + return "{path:'apps_res/cap/customCtrlResources/contractResources/',jsUri:'js/openUnflow.js',initMethod:'init',nameSpace:'field_" + getKey() + "'}"; + } + + /** (non-Javadoc) + * @see com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl#getMBInjectionInfo() + * 移动端的资源地址 + */ + public String getMBInjectionInfo() { + return "{path:'http://newwidget.v5.cmp/v1.0.0/',weixinpath:'newwidget',jsUri:'js/newwidget.js',initMethod:'init',nameSpace:'field_" + this.getKey() + "'}"; + } + + public String getText() { + return "计算租金"; + } + + public boolean canBathUpdate() { + return false; + } + + public List getListShowDefaultVal(Integer externalType) { + return null; + } + + /** + * 初始值生成接口 + */ + public String[] getDefaultVal(String defaultValue) { + return new String[0]; + } + + public boolean canInjectionWord() { + return false; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/fieldCtrl/UpdateLeaseContractFieldCtrl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/fieldCtrl/UpdateLeaseContractFieldCtrl.java new file mode 100644 index 0000000..59559fc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/fieldCtrl/UpdateLeaseContractFieldCtrl.java @@ -0,0 +1,86 @@ +package com.seeyon.apps.src_contract.lease.fieldCtrl; + +import java.util.List; + +import com.seeyon.cap4.form.bean.ParamDefinition; +import com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl; +import com.seeyon.cap4.form.util.Enums.ParamType; + +import www.seeyon.com.utils.UUIDUtil; + +/** + *
+ * 自定义控件:调用接口
+ * 
+ */ +public class UpdateLeaseContractFieldCtrl extends FormFieldCustomCtrl { + + /** + * UUIDLong.longUUID() + * UUIDUtil.getUUIDString() + */ + public String getKey() { + return "8242057900238996215"; + } + + public String getText() { + return "变更租赁合同计算租金"; + } + + public static void main(String[] args) { + System.out.println(UUIDUtil.getUUIDLong()); + } + + public String getFieldLength() { + return "20"; + } + + /** + * 控件初始化接口,此接口在控件初始化的时候,会调用,主要用于定义控件所属插件id、在表单编辑器中的图标、表单编辑器中有哪些属性可以设置。 + * 使用举例:在接口中定义自定义控件在在表单编辑器中有哪些控件属性需要配置 + */ + public void init() { + setPluginId("contract"); + setIcon("cap-icon-contract"); + // 自定义参数 + ParamDefinition templateIdParam = new ParamDefinition(); + templateIdParam.setParamType(ParamType.button); + addDefinition(templateIdParam); + } + + /** (non-Javadoc) + * @see com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl#getPCInjectionInfo() + * PC端的资源文件路径 + */ + public String getPCInjectionInfo() { + return "{path:'apps_res/cap/customCtrlResources/updateleasecontractResources/',jsUri:'js/openUnflow.js',initMethod:'init',nameSpace:'field_" + getKey() + "'}"; + } + + /** (non-Javadoc) + * @see com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl#getMBInjectionInfo() + * 移动端的资源地址 + */ + public String getMBInjectionInfo() { + return "{path:'http://newwidget.v5.cmp/v1.0.0/',weixinpath:'newwidget',jsUri:'js/newwidget.js',initMethod:'init',nameSpace:'field_" + this.getKey() + "'}"; + } + + public boolean canBathUpdate() { + return false; + } + + public List getListShowDefaultVal(Integer externalType) { + return null; + } + + /** + * 初始值生成接口 + */ + public String[] getDefaultVal(String defaultValue) { + return new String[0]; + } + + public boolean canInjectionWord() { + return false; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/A8FolderKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/A8FolderKit.java new file mode 100644 index 0000000..7bdfddf --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/A8FolderKit.java @@ -0,0 +1,39 @@ +package com.seeyon.apps.src_contract.lease.kit; + +import com.seeyon.ctp.common.SystemEnvironment; + +/** + * Description + *
获取A8产品下面的文件夹路径
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class A8FolderKit { + + private static String SH_PROP = ""; + private static String JDBC_PROP = ""; + + /** + * Description: + *
获取到A8的安装应用目录  seeyon
+ * @return + */ + public static String getPropFile() { + if("".equals(SH_PROP)) { + SH_PROP = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_contract/BIPcontract.properties"; + } + return SH_PROP; + } + + /** + * Description: + *
获取到A8的安装应用目录  seeyon
+ * @return + */ + public static String getPropJDBCFile() { + if("".equals(JDBC_PROP)) { + JDBC_PROP = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_contract/JDBCcontract.properties"; + } + return JDBC_PROP; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/CAP4FormKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/CAP4FormKit.java new file mode 100644 index 0000000..c323f50 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/CAP4FormKit.java @@ -0,0 +1,205 @@ +package com.seeyon.apps.src_contract.lease.kit; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormDataBean; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.cap4.form.service.CAP4FormManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; + + +/** + * Description + *

+ * @author FanGaowei
+ * Date 2018年1月23日 上午11:22:28
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class CAP4FormKit { + + private static final Log LOGGER = CtpLogFactory.getLog(CAP4FormKit.class); + + public static FormBean getFormBean(CAP4FormManager cap4FormManager, String code) { + FormBean formBean = null; + try { + formBean = cap4FormManager.getFormByFormCode(code); + } catch(BusinessException e) { + LOGGER.error("获取表单发生异常,编号:" + code, e); + } + return formBean; + } + + /** + * 根据表单的显示名称获取字段的值 + * @param bean + * @param disPlay + * @return + */ + public static Object getFieldValue(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return bean.getFieldValue(field.getName()); + } + + + public static int getIntValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.toInteger(value); + } + + public static String getFieldStrValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.str(value, true); + } + + public static Object getFieldValueByName(FormDataBean bean, String fieldName) { + return bean.getFieldValue(fieldName); + } + + /** + * 根据表单的显示名称获取字段是 field000? + * @param bean + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getMasterTableBean(); + return getFieldTaleId(table, disPlay); + } + + /** + * 直接根据table来获取 + * @param table + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormTableBean table, String disPlay) { + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return field.getName(); + } + + public static String getFieldTaleId(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + return null; + } + return field.getName(); + } + + public static FormFieldBean getFieldBean(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(null == field) { + LOGGER.info("字段不存在:" + disPlay); + } + return field; + } + + + /** + * Description: + *

+	 * @param bean 这里的bean必须是getMasterBean() 方法获取到的bean
+	 * @param disPlay 
+	 * @param value
+	 */
+	public static void setCellValue(FormDataBean bean, String disPlay, Object value) {
+		FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+		if(cell != null) {
+			bean.addFieldValue(cell.getName(), value);
+		}
+	}
+	
+	public static void setCellValue(FormDataSubBean bean, String disPlay, Object value) {
+        FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+        if(cell != null) {
+            bean.addFieldValue(cell.getName(), value);
+        }
+    }
+	
+	/**
+	 * Description:
+	 * 
只适用于只有一个子表的表单
+ * @param colManager + * @param data + * @return + * @throws Exception + */ + public static List getSubBeans(FormDataMasterBean master) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + return subs.get(key); + } + return null; + } + + public static List getSubBeans(FormDataMasterBean master, String display) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + FormDataSubBean data = subs.get(key).get(0); + if(display.equals(data.getFormTable().getDisplay())) { + return subs.get(key); + } + } + LOGGER.info("表单不存在:" + display); + return null; + } + + /** + * Description: + *
获取从表字段
+ * @param sub + * @param disPlay + * @return + */ + public static Object getSubFieldValue(FormDataSubBean sub, String disPlay) { + return getFieldValue(sub, disPlay); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/DateKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/DateKit.java new file mode 100644 index 0000000..41e7973 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/DateKit.java @@ -0,0 +1,293 @@ +package com.seeyon.apps.src_contract.lease.kit; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 日期处理工具类 + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class DateKit { + + private static SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd"); + + private static SimpleDateFormat sixFormat = new SimpleDateFormat("yyMMdd"); + + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private static SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); + + private static SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM"); + + private static SimpleDateFormat weekDay = new SimpleDateFormat("MM-dd"); + + private static SimpleDateFormat hour = new SimpleDateFormat("HH:mm"); + + private static SimpleDateFormat detailDate = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + + private static final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五","星期六" }; + + public static int getYear(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } + + public static String getSixDate() { + return getSixDate(null); + } + + public static String getSixDate(Date date) { + if(null == date) { + return sixFormat.format(new Date()); + } + return sixFormat.format(date); + } + + /** + * 获取这个时间属于一年的第几周 + * @param date + * @return + */ + public static int getWeekNum(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int week = cal.get(Calendar.WEEK_OF_YEAR); + // 如果是星期天,那么需要减1 + if("星期日".equals(DateKit.getDayWeekName(date))) { + week -= 1; + } + return week; + } + + /** + * Description: + * + *
+     * 获取一周
+     * 
+ * + * @param date + * @return + */ + public static void getWeekInterval(Map param) { + Calendar cal = Calendar.getInstance(); + // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 + if(1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + // 获得当前日期是一个星期的第几天 + int day = cal.get(Calendar.DAY_OF_WEEK); + // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 + cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); + param.put("startDate", cal.getTime()); + // System.out.println("所在周星期一的日期:" + imptimeBegin); + cal.add(Calendar.DATE, 6); + param.put("endDate", cal.getTime()); + // System.out.println("所在周星期日的日期:" + imptimeEnd); + } + + /** + * Description: + * + *
+     * 根据传入的日期,获取当前日期所在的一周时间段
+     * 
+ * + * @param date + * @return + */ + public static void getWeekInterval(Map param, Date now) { + Calendar cal = Calendar.getInstance(); + cal.setTime(now); + // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 + if(1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + // 获得当前日期是一个星期的第几天 + int day = cal.get(Calendar.DAY_OF_WEEK); + // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 + cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); + String time = DateKit.getDayDate(cal.getTime()) + " 00:00:00"; + try { + param.put("beginDate", DateKit.getdayDate(time)); + } catch(Exception e) { + // TODO + } + // System.out.println("所在周星期一的日期:" + imptimeBegin); + cal.add(Calendar.DATE, 6); + time = DateKit.getDayDate(cal.getTime()) + " 23:59:59"; + try { + param.put("endDate", DateKit.getdayDate(time)); + } catch(Exception e) { + // + } + // System.out.println("所在周星期日的日期:" + imptimeEnd); + } + + public static String getSimpleDate(Date date) { + if(date == null) { + return ""; + } + return simple.format(date); + } + + /** + * 给日志格式化使用 + * @param date + * @return + */ + public static String getDate4Cal(Date date) { + if(date == null) { + return ""; + } + return hour.format(date); + } + + public static String getDateString(Date date) { + if(date == null) { + return ""; + } + return sdf.format(date); + } + + public static String getDayDate(Date date) { + if(date == null) { + return ""; + } + return dayFormat.format(date); + } + + public static String getWeekDay(Date date) { + if(date == null) { + return ""; + } + return weekDay.format(date); + } + + /** + * Description: + * + *
+     * 获取多少天以后的日期
+     * 
+ * + * @param day + * @return + */ + public static Date getDayAfter(int day) { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, day); + return cal.getTime(); + } + // 获得某天的几天后 + public static Date getDayAfter(Date d, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.DATE, day); + return cal.getTime(); + } + + /** + * 获取一个月有多少天 + * @param year + * @param month + * @return + */ + public static int getDaysByYearMonth(int year, int month) { + Calendar a = Calendar.getInstance(); + a.set(Calendar.YEAR, year); + a.set(Calendar.MONTH, month); + a.set(Calendar.DATE, 1); + a.roll(Calendar.DATE, -1); + int maxDate = a.get(Calendar.DATE); + return maxDate; + } + + /** + * 获取今天是星期几 + * @param date + * @return + */ + public static String getDayWeekName(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; + if(dayOfWeek < 0) + dayOfWeek = 0; + return dayNames[dayOfWeek]; + } + + /** + * 解析时间,先解析yyyy-MM-dd HH:mm:ss + * @param dateStr + * @return + * @throws ParseException + * @throws Exception + */ + public static Date getdayDate(String dateStr) throws Exception { + try { + return sdf.parse(dateStr); + } catch(Exception e) { + try { + return detailDate.parse(dateStr); + } catch(Exception e1) { + try { + return dayFormat.parse(dateStr); + } catch(Exception e2) { + try { + return simple.parse(dateStr); + } + catch(Exception e3) { + return monthFormat.parse(dateStr); + } + } + } + } + } + + /** + * 根据时间获取周区间字符串 + * @param now + * @return 第XX周:2018-08-27至2018-09-02 + */ + public static String getWeekNumAndDateZone(Date now) { + StringBuffer sb = new StringBuffer(); + sb.append("第"); + sb.append(getWeekNum(now)); + sb.append("周:"); + Map param = new HashMap(); + getWeekInterval(param, now); + Date beginDate = (Date)param.get("beginDate"); + Date endDate = (Date)param.get("endDate"); + sb.append(dayFormat.format(beginDate)); + sb.append("至"); + sb.append(dayFormat.format(endDate)); + return sb.toString(); + } + + /** + * 根据日期和时间获取一个返回该日期该时间的date + * @param d 日期 + * @param time 时间 HH:mm格式 + * @return d日期+time时间 + * @throws ParseException + */ + public static Date getDateFromTime(Date d, String time) throws ParseException { + String dateTime = dayFormat.format(d) + " " + time; + return detailDate.parse(dateTime); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/PropJDBCKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/PropJDBCKit.java new file mode 100644 index 0000000..6501a68 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/PropJDBCKit.java @@ -0,0 +1,71 @@ +package com.seeyon.apps.src_contract.lease.kit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + + + +/** + * 读取参数 + */ + +public class PropJDBCKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + public static final String PROFILE = "profile"; + + public static final String JDBCDRIVER = "jdbcdriver"; + public static final String JDBCURL = "jdbcurl"; + public static final String JDBCUSER = "jdbcuser"; + public static final String JDBCPASSWORD = "jdbcpassword"; + + public static final String PROD_JDBCDRIVER = "prod.jdbcdriver"; + public static final String PROD_JDBCURL = "prod.jdbcurl"; + public static final String PROD_JDBCUSER = "prod.jdbcuser"; + public static final String PROD_JDBCPASSWORD = "prod.jdbcpassword"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(A8FolderKit.getPropJDBCFile()); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + String profile = prop.getProperty(PROFILE); + if("prod".equals(profile)) { + props.put(JDBCDRIVER, prop.getProperty(PROD_JDBCDRIVER)); + props.put(JDBCURL, prop.getProperty(PROD_JDBCURL)); + props.put(JDBCUSER, prop.getProperty(PROD_JDBCUSER)); + props.put(JDBCPASSWORD, prop.getProperty(PROD_JDBCPASSWORD)); + } else { + props.put(JDBCDRIVER, prop.getProperty(PROD_JDBCDRIVER)); + props.put(JDBCURL, prop.getProperty(PROD_JDBCURL)); + props.put(JDBCUSER, prop.getProperty(PROD_JDBCUSER)); + props.put(JDBCPASSWORD, prop.getProperty(PROD_JDBCPASSWORD)); + } + } + return props.get(key); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/PropKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/PropKit.java new file mode 100644 index 0000000..30622a4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/PropKit.java @@ -0,0 +1,113 @@ +package com.seeyon.apps.src_contract.lease.kit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + + +/** + * 读取参数 + */ + +public class PropKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + public static final String PROFILE = "profile"; + + public static final String LEASEURL = "leasrUrl"; + public static final String LEASEPROCEEDSURL = "leasrProceedsUrl"; + public static final String UPDATELEASEURL = "updateleasrUrl"; + public static final String PAYMENTPLANDETAILURL = "paymentplandetailUrl"; + public static final String LEASRTERMINATIONURL = "leasrTerminationUrl"; + public static final String LEASRTERMINATIONFKURL = "leasrTerminationfkUrl"; + public static final String LEASRDERATEURL = "leasrDerateUrl"; + public static final String FCTCHANGEPLANDETAILURL = "fctChangeplandetailUrl"; + + public static final String RECEIVECONTRACTURL = "receivecontractUrl"; + public static final String PAYMENTCONTRACTURL = "paymentcontractUrl"; + public static final String TERMINATIONCONTRACTURL = "terminationcontractUrl"; + public static final String TERMINATIONFKCONTRACTURL = "terminationfkcontractUrl"; + public static final String HTPAYBILLSERVLETURL = "htpaybillServletUrl"; + + public static final String PROD_LEASEURL = "prod.leaseUrl"; + public static final String PROD_LEASEPROCEEDSURL = "prod.leasrProceedsUrl"; + public static final String PROD_UPDATELEASEURL = "prod.updateleasrUrl"; + public static final String PROD_PAYMENTPLANDETAILURL = "prod.paymentplandetailUrl"; + public static final String PROD_LEASRTERMINATIONURL = "prod.leasrTerminationUrl"; + public static final String PROD_LEASRTERMINATIONFKURL = "prod.leasrTerminationfkUrl"; + public static final String PROD_LEASRDERATEURL = "prod.leasrDerateUrl"; + public static final String PROD_FCTCHANGEPLANDETAILURL = "prod.fctChangeplandetailUrl"; + + public static final String PROD_RECEIVECONTRACTURL = "prod.receivecontractUrl"; + public static final String PROD_PAYMENTCONTRACTURL = "prod.paymentcontractUrl"; + public static final String PROD_TERMINATIONCONTRACTURL = "prod.terminationcontractUrl"; + public static final String PROD_TERMINATIONFKCONTRACTURL = "prod.terminationfkcontractUrl"; + public static final String PROD_PAYBILLSERVLETURL = "prod.paybillServletUrl"; + public static final String PROD_HTPAYBILLSERVLETURL = "prod.htpaybillServletUrl"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(A8FolderKit.getPropFile()); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + String profile = prop.getProperty(PROFILE); + if("prod".equals(profile)) { + props.put(LEASEURL, prop.getProperty(PROD_LEASEURL)); + props.put(LEASEPROCEEDSURL, prop.getProperty(PROD_LEASEPROCEEDSURL)); + props.put(UPDATELEASEURL, prop.getProperty(PROD_UPDATELEASEURL)); + props.put(PAYMENTPLANDETAILURL, prop.getProperty(PROD_PAYMENTPLANDETAILURL)); + props.put(LEASRTERMINATIONURL, prop.getProperty(PROD_LEASRTERMINATIONURL)); + props.put(LEASRTERMINATIONFKURL, prop.getProperty(PROD_LEASRTERMINATIONFKURL)); + props.put(LEASRDERATEURL, prop.getProperty(PROD_LEASRDERATEURL)); + props.put(FCTCHANGEPLANDETAILURL, prop.getProperty(PROD_FCTCHANGEPLANDETAILURL)); + + props.put(RECEIVECONTRACTURL, prop.getProperty(PROD_RECEIVECONTRACTURL)); + props.put(PAYMENTCONTRACTURL, prop.getProperty(PROD_PAYMENTCONTRACTURL)); + props.put(TERMINATIONCONTRACTURL, prop.getProperty(PROD_TERMINATIONCONTRACTURL)); + props.put(TERMINATIONFKCONTRACTURL, prop.getProperty(PROD_TERMINATIONFKCONTRACTURL)); + props.put(HTPAYBILLSERVLETURL, prop.getProperty(PROD_HTPAYBILLSERVLETURL)); + + } else { + props.put(LEASEURL, prop.getProperty(PROD_LEASEURL)); + props.put(LEASEPROCEEDSURL, prop.getProperty(PROD_LEASEPROCEEDSURL)); + props.put(UPDATELEASEURL, prop.getProperty(PROD_UPDATELEASEURL)); + props.put(PAYMENTPLANDETAILURL, prop.getProperty(PROD_PAYMENTPLANDETAILURL)); + props.put(LEASRTERMINATIONURL, prop.getProperty(PROD_LEASRTERMINATIONURL)); + props.put(LEASRTERMINATIONFKURL, prop.getProperty(PROD_LEASRTERMINATIONFKURL)); + props.put(LEASRDERATEURL, prop.getProperty(PROD_LEASRDERATEURL)); + props.put(FCTCHANGEPLANDETAILURL, prop.getProperty(PROD_FCTCHANGEPLANDETAILURL)); + + props.put(RECEIVECONTRACTURL, prop.getProperty(PROD_RECEIVECONTRACTURL)); + props.put(PAYMENTCONTRACTURL, prop.getProperty(PROD_PAYMENTCONTRACTURL)); + props.put(TERMINATIONCONTRACTURL, prop.getProperty(PROD_TERMINATIONCONTRACTURL)); + props.put(TERMINATIONFKCONTRACTURL, prop.getProperty(PROD_TERMINATIONFKCONTRACTURL)); + props.put(HTPAYBILLSERVLETURL, prop.getProperty(PROD_HTPAYBILLSERVLETURL)); + + } + } + return props.get(key); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/StrKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/StrKit.java new file mode 100644 index 0000000..5f5a4c4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/StrKit.java @@ -0,0 +1,251 @@ +package com.seeyon.apps.src_contract.lease.kit; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 字符处理工具类 + * @date 2018年5月23日上午9:05:01 + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class StrKit { + + public static String str(Object o) { + if(o == null) { + return null; + } + if(o instanceof Date) { + return DateKit.getDayDate((Date)o); + } + if(o instanceof Timestamp) { + return DateKit.getDayDate((Timestamp)o); + } + if(o instanceof String) { + return (String)o; + } + return o.toString(); + } + + public static String str(Object o, boolean null2Str) { + if(o == null && null2Str) { + return ""; + } + return str(o); + } + + public static float toFloat(Object o) { + if(o == null) { + return 0f; + } else if(o instanceof Float) { + return (Float)o; + } else if(o instanceof String) { + return Float.valueOf((String)o); + } else if(o instanceof BigDecimal) { + return ((BigDecimal)o).floatValue(); + } + return 0f; + } + + public static Long toLong(Object o) { + if(null == o) { + return 0L; + } else if(o instanceof Long) { + return (Long)o; + } else if(o instanceof String) { + if("".equals(o)) { + return 0L; + } + return Long.valueOf((String)o); + } else if(o instanceof BigDecimal) { + return ((BigDecimal)o).longValue(); + } + return 0L; + } + + /** + * 取int值,为空返回0 + * @param obj 对象 + * @return + */ + public static Integer toInteger(Object obj) { + if(obj == null) { + return 0; + } else if(obj instanceof Long){ + return ((Long)obj).intValue(); + } else if(obj instanceof BigDecimal) { + return ((BigDecimal)obj).intValue(); + }else if(obj instanceof String) { + String o = (String) obj; + if("".equals(o)) { + return 0; + } else { + try { + return Integer.valueOf((String) obj); + } catch(Exception e) { + return 0; + } + } + } else if(obj instanceof Integer) { + return (Integer) obj; + } + return 0; + } + + public static Date toDate(Object o) throws Exception { + if(null == o) { + return null; + } else if(o instanceof Date) { + return (Date)o; + } else if(o instanceof Timestamp) { + return ((Timestamp) o); + } else if(o instanceof String){ + return DateKit.getdayDate((String) o); + } + return null; + } + + public static List toList(Object o) { + if(o == null) { + return null; + } else if(o instanceof List) { + return (List) o; + } else { + return null; + } + } + + /** + * 判断对象是否为空 + * @param o + * @return + */ + public static boolean isNull(Object o) { + if(null == o) { + return true; + } + if(o instanceof String) { + return "".equals((String) o); + } + if(o instanceof Collection) { + // 集合数量为0 则为空 + return ((Collection) o).size() == 0; + } + return false; + } + + /** + * 删除最后一个字符 + * @param input + * @return + */ + public static String deleteLastChar(String input) { + if(isNull(input)) + return ""; + return input.substring(0, input.length() - 1); + + } + + /** + * 转换成 123,456,789的格式 + * @param inputString + * @param length + * @return + */ + public static String getListStr(String inputString, int length) { + if(isNull(inputString)) + return ""; + String str = ""; + List strList = getStrList(inputString, length); + for(String string : strList) { + str += string + ","; + } + return deleteLastChar(str); + } + + /** + * 把原始字符串分割成指定长度的字符串列表 + * + * @param inputString + * 原始字符串 + * @param length + * 指定长度 + * @return + */ + public static List getStrList(String inputString, int length) { + int size = inputString.length() / length; + if (inputString.length() % length != 0) { + size += 1; + } + return getStrList(inputString, length, size); + } + + /** + * 把原始字符串分割成指定长度的字符串列表 + * + * @param inputString + * 原始字符串 + * @param length + * 指定长度 + * @param size + * 指定列表大小 + * @return + */ + private static List getStrList(String inputString, int length, + int size) { + List list = new ArrayList(); + for (int index = 0; index < size; index++) { + String childStr = substring(inputString, index * length, + (index + 1) * length); + list.add(childStr); + } + return list; + } + + /** + * 分割字符串,如果开始位置大于字符串长度,返回空 + * + * @param str + * 原始字符串 + * @param f + * 开始位置 + * @param t + * 结束位置 + * @return + */ + private static String substring(String str, int f, int t) { + if (f > str.length()) + return null; + if (t > str.length()) { + return str.substring(f, str.length()); + } else { + return str.substring(f, t); + } + } + + public static String getFixedLengthStr(String str, int length) { + // 如果为空,返回全部都是0 + if(length < 1) { + return ""; + } + if(isNull(str)) { + return getZeor(length); + } + if(str.length() < length) { + return getZeor(length - str.length()) + str; + } + return str.substring(0, length); + } + + private static String getZeor(int length) { + String str = ""; + for(int i = 0; i < length; i++) { + str += "0"; + } + return str; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/form/CAP4FormKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/form/CAP4FormKit.java new file mode 100644 index 0000000..134df7a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/kit/form/CAP4FormKit.java @@ -0,0 +1,206 @@ +package com.seeyon.apps.src_contract.lease.kit.form; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.seeyon.apps.src_contract.lease.kit.StrKit; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormDataBean; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.cap4.form.service.CAP4FormManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; + + +/** + * Description + *

+ * @author FanGaowei
+ * Date 2018年1月23日 上午11:22:28
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class CAP4FormKit { + + private static final Log LOGGER = CtpLogFactory.getLog(CAP4FormKit.class); + + public static FormBean getFormBean(CAP4FormManager cap4FormManager, String code) { + FormBean formBean = null; + try { + formBean = cap4FormManager.getFormByFormCode(code); + } catch(BusinessException e) { + LOGGER.error("获取表单发生异常,编号:" + code, e); + } + return formBean; + } + + /** + * 根据表单的显示名称获取字段的值 + * @param bean + * @param disPlay + * @return + */ + public static Object getFieldValue(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return bean.getFieldValue(field.getName()); + } + + + public static int getIntValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.toInteger(value); + } + + public static String getFieldStrValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.str(value, true); + } + + public static Object getFieldValueByName(FormDataBean bean, String fieldName) { + return bean.getFieldValue(fieldName); + } + + /** + * 根据表单的显示名称获取字段是 field000? + * @param bean + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getMasterTableBean(); + return getFieldTaleId(table, disPlay); + } + + /** + * 直接根据table来获取 + * @param table + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormTableBean table, String disPlay) { + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return field.getName(); + } + + public static String getFieldTaleId(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + return null; + } + return field.getName(); + } + + public static FormFieldBean getFieldBean(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(null == field) { + LOGGER.info("字段不存在:" + disPlay); + } + return field; + } + + + /** + * Description: + *

+	 * @param bean 这里的bean必须是getMasterBean() 方法获取到的bean
+	 * @param disPlay 
+	 * @param value
+	 */
+	public static void setCellValue(FormDataBean bean, String disPlay, Object value) {
+		FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+		if(cell != null) {
+			bean.addFieldValue(cell.getName(), value);
+		}
+	}
+	
+	public static void setCellValue(FormDataSubBean bean, String disPlay, Object value) {
+        FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+        if(cell != null) {
+            bean.addFieldValue(cell.getName(), value);
+        }
+    }
+	
+	/**
+	 * Description:
+	 * 
只适用于只有一个子表的表单
+ * @param colManager + * @param data + * @return + * @throws Exception + */ + public static List getSubBeans(FormDataMasterBean master) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + return subs.get(key); + } + return null; + } + + public static List getSubBeans(FormDataMasterBean master, String display) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + FormDataSubBean data = subs.get(key).get(0); + if(display.equals(data.getFormTable().getDisplay())) { + return subs.get(key); + } + } + LOGGER.info("表单不存在:" + display); + return null; + } + + /** + * Description: + *
获取从表字段
+ * @param sub + * @param disPlay + * @return + */ + public static Object getSubFieldValue(FormDataSubBean sub, String disPlay) { + return getFieldValue(sub, disPlay); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/CntractPaymentNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/CntractPaymentNode.java new file mode 100644 index 0000000..8379ae1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/CntractPaymentNode.java @@ -0,0 +1,115 @@ +package com.seeyon.apps.src_contract.lease.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +/** + * 租赁合同收款超级节点 + * @author lenovo + * + */ +public class CntractPaymentNode extends ACommonSuperNode { + + private static final Log log = Log.get(CntractPaymentNode.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "cntractPaymentNode"; + } + + @Override + public String getNodeName() { + return "OA合同付款单同步BIP付款单超级节点"; + } + + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + String summaryId = formDataVo.getColSummary().getId()+""; + FieldDataVo bipfhjgVo = formDataVo.getFieldData("BIP返回结果"); + String bipfhjg = ""; + if(bipfhjgVo!=null){ + bipfhjg = bipfhjgVo.getStringValue(); + } + if(bipfhjg.contains("成功")){ + context.success("跳过:"+bipfhjg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "跳过:"+bipfhjg); + return context; + } + try { + LeaseContractParam leaseContractParam = new LeaseContractParam(); + JSONObject jsonObject = leaseContractParam.getCntractPaymentNodeParam(formDataVo,summaryId); + JSONObject headerer = HeaderUtil.getHeader(); + String url = PropKit.getProp(PropKit.HTPAYBILLSERVLETURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject,url , headerer); + context.setResponse(res.toString()); +// 判断调用BIP是否返回数据 + if(res.isEmpty()) { +// 没有返回数据则设置调用错误,并返回接口 + context.back("付款单生成失败,请联系管理员处理"); + context.setErrMsg("付款单生成失败,请联系管理员处理"); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "付款单生成失败,请联系管理员处理"); + return context; + } + String msg = res.get("msg").toString(); + String isStatus = res.get("status").toString(); + if("1".equals(isStatus)) { +// System.out.println("推送BIP付款单成功"); + log.info("推送BIP付款单成功"); + context.success(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", res.get("msg")); + }else { + log.info("推送BIP付款单失败"+res.get("msg").toString()); + context.back(msg); + context.setErrMsg(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", res.get("msg")); + } + } catch (Exception e) { + log.error("异常:"+ e); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + e.printStackTrace(); + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractDerateNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractDerateNode.java new file mode 100644 index 0000000..6fff0dd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractDerateNode.java @@ -0,0 +1,96 @@ +package com.seeyon.apps.src_contract.lease.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class LeaseContractDerateNode extends ACommonSuperNode { + + private static final Log log = Log.get(LeaseContractDerateNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + @Override + public String getNodeId() { + return "leaseContractDerateNode"; + } + @Override + public String getNodeName() { + return "OA租赁合同租金减免BIP租赁合同超级节点"; + } + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + String bipfhjg = formDataVo.getFieldData("BIP返回结果")!=null?formDataVo.getFieldData("BIP返回结果").getStringValue():""; + if(bipfhjg.contains("成功")){ + context.success("跳过:"+bipfhjg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "跳过:"+bipfhjg); + return context; + } + try { + LeaseContractParam leaseContractParam = new LeaseContractParam(); + JSONObject jsonObject = leaseContractParam.getLeaseContractDerateParam(formDataVo); + JSONObject headerer = HeaderUtil.getHeader(); + String url = PropKit.getProp(PropKit.LEASRDERATEURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + if(res.isEmpty()) { + log.info("调用租赁合同减免接口失败,请联系管理员处理"); + context.back("调用租赁合同减免接口失败,请联系管理员处理"); + context.setErrMsg("调用租赁合同减免接口失败,请联系管理员处理"); + }else { + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + formDataVo.getNewFieldDataMap().put("BIP返回结果", res.get("msg")); + log.info("推送BIP租赁合同减免信息成功"); + context.success(msg); + }else { + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP租赁合同减免申请失败:"+res.get("msg").toString()); + log.info("推送BIP租赁合同减免申请失败:"+res.get("msg").toString()); + context.back(msg); + context.setErrMsg(msg); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error("异常:"+ e); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP租赁合同减免信息失败:"+e); + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractNode.java new file mode 100644 index 0000000..f1510fc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractNode.java @@ -0,0 +1,104 @@ +package com.seeyon.apps.src_contract.lease.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class LeaseContractNode extends ACommonSuperNode { + + private static final Log log = Log.get(LeaseContractNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "leaseContractNode"; + } + + @Override + public String getNodeName() { + return "OA租赁合同同步BIP收款合同超级节点"; + } + + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + String summaryId = formDataVo.getColSummary().getId()+""; + String bipfhjg = formDataVo.getFieldData("BIP返回结果").getStringValue(); + if(bipfhjg.contains("成功")){ + context.success("跳过:"+bipfhjg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "跳过:"+bipfhjg); + return context; + } + try { + LeaseContractParam leaseContractParam = new LeaseContractParam(); + JSONObject jsonObject = leaseContractParam.getLeaseContractParam(formDataVo,summaryId); + JSONObject headerer = HeaderUtil.getHeader(); + log.info(headerer.toString()); + String url = PropKit.getProp(PropKit.LEASEURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject,url , headerer); + context.setResponse(res.toString()); + if(res.isEmpty()) { + context.back("租赁合同创建失败,请联系管理员处理"); + context.setErrMsg("租赁合同创建失败,请联系管理员处理"); + log.info("租赁合同创建失败,请联系管理员处理"); + }else { + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + formDataVo.getNewFieldDataMap().put("BIP返回结果", res.get("msg")); + log.info("推送BIP收款合同成功"); + context.success(msg); + }else { + context.back(msg); + context.setErrMsg(msg); + log.info("推送BIP收款合同失败:"+res.get("msg").toString()); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP收款合同失败:"+res.get("msg").toString()); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error("异常:"+ e); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP收款合同失败:"+e); + } + return context; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractProceedsNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractProceedsNode.java new file mode 100644 index 0000000..b5e42dc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractProceedsNode.java @@ -0,0 +1,123 @@ +package com.seeyon.apps.src_contract.lease.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +/** + * 合同收款超级节点 + * @author lenovo + * + */ +public class LeaseContractProceedsNode extends ACommonSuperNode { + + private static final Log log = Log.get(LeaseContractProceedsNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "leaseContractProceedsNode"; + } + @Override + public String getNodeName() { + return "OA合同收款单同步BIP收款单超级节点"; + } + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + System.out.println("开始处理单据"); + String summaryId = formDataVo.getColSummary().getId()+"";; + String bipfhjg = formDataVo.getFieldData("BIP返回结果")!=null?formDataVo.getFieldData("BIP返回结果").getStringValue():""; + if(bipfhjg.contains("成功")){ + context.success("跳过:"+bipfhjg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "跳过:"+bipfhjg); + return context; + } + try { + LeaseContractParam leaseContractParam = new LeaseContractParam(); +// String proceedsTypeId= CAP4FormKit.getFieldStrValue(master, "收款合同类型"); + String proceedsTypeId= formDataVo.getFieldData("收款合同类型")!=null?formDataVo.getFieldData("收款合同类型").getDbValue()+"":""; + String proceedsType = getEnumManagerNew().getEnumItem(Long.parseLong(proceedsTypeId)).getValue(); + JSONObject jsonObject = new JSONObject(); + if("1".equals(proceedsType)) { + jsonObject = leaseContractParam.getContractProceedsParam(formDataVo,summaryId); + }else { + jsonObject = leaseContractParam.getLeaseContractProceedsParam(formDataVo,summaryId); + } + JSONObject headerer = HeaderUtil.getHeader(); + String url = PropKit.getProp(PropKit.LEASEPROCEEDSURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + if(!res.isEmpty()) { + log.info("推送BIP收款合同失败"); + context.back("收款单生成失败,请联系管理员处理"); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "收款单生成失败,请联系管理员处理"); + } + String msg = res.get("msg").toString(); + String isStatus = res.get("status").toString(); + if("1".equals(isStatus)) { + log.info("推送BIP收款单成功"); + context.success(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果",res.get("msg")); + }else { + context.back(res.get("msg").toString()); + context.setErrMsg(res.get("msg").toString()); + log.info("推送BIP收款单失败"+res.get("msg").toString()); + formDataVo.getNewFieldDataMap().put("BIP返回结果",res.get("msg")); + } + } catch (Exception e) { + log.error("异常:"+ e); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + e.printStackTrace(); + formDataVo.getNewFieldDataMap().put("BIP返回结果","异常:"+ e); + } + return context; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractTerminationNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractTerminationNode.java new file mode 100644 index 0000000..64c24bf --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/LeaseContractTerminationNode.java @@ -0,0 +1,136 @@ +package com.seeyon.apps.src_contract.lease.node; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; + +public class LeaseContractTerminationNode extends ACommonSuperNode { + + private static final Log log = Log.get(LeaseContractTerminationNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + @Override + public String getNodeId() { + return "leaseContractTerminationNode"; + } + @Override + public String getNodeName() { + return "OA合同终止同步BIP合同终止状态超级节点"; + } + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { +// 进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); +// String bipfhjg = CAP4FormKit.getFieldStrValue(master, "BIP返回结果"); + String bipfhjg = formDataVo.getFieldData("BIP返回结果")!=null?formDataVo.getFieldData("BIP返回结果").getStringValue():""; + if(bipfhjg.contains("成功")){ + context.success("跳过:"+bipfhjg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "跳过:"+bipfhjg); + return context; + } + try { +// String contractType = CAP4FormKit.getFieldStrValue(master, "合同类型文本"); + String contractType = formDataVo.getFieldData("合同类型文本")!=null?formDataVo.getFieldData("合同类型文本").getStringValue():""; + LeaseContractParam leaseContractParam = new LeaseContractParam(); + JSONObject headerer = HeaderUtil.getHeader(); + System.out.println(headerer); + JSONObject res = new JSONObject(); + String url = ""; + if("租赁合同".equals(contractType)) { + url = PropKit.getProp(PropKit.LEASRTERMINATIONURL); + context.setUrl(url); + JSONObject jsonObject = leaseContractParam.getLeaseContractTerminationParam(formDataVo); + context.setRequest(jsonObject.toString()); + res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + }else if ("一般付款合同".equals(contractType)){ + url = PropKit.getProp(PropKit.LEASRTERMINATIONFKURL); + context.setUrl(url); + JSONObject jsonObject = leaseContractParam.getfkContractTerminationParam(formDataVo); + context.setRequest(jsonObject.toString()); + res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + }else if("一般合同".equals(contractType)) { + url = PropKit.getProp(PropKit.LEASRTERMINATIONURL); + context.setUrl(url); + JSONObject jsonObject = leaseContractParam.getskContractTerminationParam(formDataVo); + context.setRequest(jsonObject.toString()); + res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + }else{ + log.info("请检查数据是否正确"); + context.back("请检查数据是否正确"); + context.setResponse("请检查数据是否正确"); + context.setErrMsg("请检查数据是否正确"); + return context; + } + if(res.isEmpty()) { + log.info("合同终止状态失败,请联系管理员处理"); + context.back("合同终止状态失败,请联系管理员处理"); + context.setResponse("合同终止状态失败,请联系管理员处理"); + context.setErrMsg("合同终止状态失败,请联系管理员处理"); + }else { + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + log.info("推送BIP合同终止状态成功"); + context.success(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", res.get("msg")); + }else { + log.info("推送BIP合同终止状态失败:"+res.get("msg").toString()); + context.back(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP合同终止状态失败:"+res.get("msg").toString()); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.info("异常:"+ e); + context.back("异常:"+ e); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP合同终止状态失败:"+e); + } + return context; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateBaozhengJinNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateBaozhengJinNode.java new file mode 100644 index 0000000..a60fa7d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateBaozhengJinNode.java @@ -0,0 +1,22 @@ +package com.seeyon.apps.src_contract.lease.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +public class UpdateBaozhengJinNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_fct_updatereceivecontractservlet"; + } + + @Override + public String getNodeId() { + return "updateBaozhengJinNode"; + } + + @Override + public String getNodeName() { + return "BIP-租赁合同变更含浮动租金"; + } +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateLeaseContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateLeaseContractNode.java new file mode 100644 index 0000000..fa7e8ac --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateLeaseContractNode.java @@ -0,0 +1,96 @@ +package com.seeyon.apps.src_contract.lease.node; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class UpdateLeaseContractNode extends ACommonSuperNode { + + private static final Log log = Log.get(LeaseContractNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "updateLeaseContractNode"; + } + + @Override + public String getNodeName() { + return "OA租赁合同变更BIP收款合同超级节点"; + } + + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + String summaryId = formDataVo.getColSummary().getId()+""; +// String bipfhjg = CAP4FormKit.getFieldStrValue(master, "BIP返回结果"); + String bipfhjg = formDataVo.getFieldData("BIP返回结果")!=null?formDataVo.getFieldData("BIP返回结果").getStringValue():""; + if(bipfhjg.contains("成功")){ + context.success("跳过:"+bipfhjg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "跳过:"+bipfhjg); + return context; + } + try { + JSONObject jsonObject = LeaseContractParam.getUpdateLeaseContractParam(formDataVo,summaryId); + JSONObject headerer = HeaderUtil.getHeader(); + log.info(headerer.toString()); + String url = PropKit.getProp(PropKit.UPDATELEASEURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject,url , headerer); + context.setResponse(res.toString()); + String isStatus = res.get("status").toString(); + if("1".equals(isStatus)) { + System.out.println("推送BIP收款合同成功"); + log.info("推送BIP收款合同成功"); + }else { + String msg = res.get("msg").toString(); + context.back(msg); + context.setErrMsg(msg); + log.info("推送BIP收款合同失败"+res.get("msg").toString()); + } + } catch (Exception e) { + log.error("异常:"+ e); + e.printStackTrace(); + context.back("异常:"+ e); + context.setErrMsg("异常:"+ e); + + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateZhuanzuJinNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateZhuanzuJinNode.java new file mode 100644 index 0000000..ba8842e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/node/UpdateZhuanzuJinNode.java @@ -0,0 +1,22 @@ +package com.seeyon.apps.src_contract.lease.node; + +import com.seeyon.apps.bip.BIPCommonNode; + +public class UpdateZhuanzuJinNode extends BIPCommonNode { + + @Override + public String getMethod() { + return "/service/sxly_oa_fct_updatereceivecontractservlet"; + } + + @Override + public String getNodeId() { + return "updateZhuanzuJinNode"; + } + + @Override + public String getNodeName() { + return "BIP-租赁合同退场含保证金转租金"; + } +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/param/LeaseContractParam.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/param/LeaseContractParam.java new file mode 100644 index 0000000..dfcea16 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/param/LeaseContractParam.java @@ -0,0 +1,1046 @@ +package com.seeyon.apps.src_contract.lease.param; + +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import org.apache.commons.io.FileUtils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_contract.lease.util.EnumUtils; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.v3x.dee.util.DateUtil; +import www.seeyon.com.utils.StringUtil; + +public class LeaseContractParam { + + private OrgManagerDirect orgManagerDirect; + + public OrgManagerDirect getOrgManagerDirect() { + if (this.orgManagerDirect == null) { + this.orgManagerDirect = ((OrgManagerDirect)AppContext.getBean("orgManagerDirect")); + } + return orgManagerDirect; + } + public void setOrgManagerDirect(OrgManagerDirect orgManagerDirect) { + this.orgManagerDirect = orgManagerDirect; + } + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + + /** + * 获取租赁合同字段并封装参数 + * @param formDataVo 表单数据对象 + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getLeaseContractParam(FormDataVo formDataVo,String summaryId) throws BusinessException, NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("financialOrg", CAP4FormKit.getFieldStrValue(master, "NC公司名称"));//NC公司名称 + jsonObject.put("financialOrg", formDataVo.getFieldData("NC公司名称")!=null?formDataVo.getFieldData("NC公司名称").getStringValue():"");//NC公司名称 +// jsonObject.put("financecode", CAP4FormKit.getFieldStrValue(master, "NC公司编号"));//NC公司编号 + jsonObject.put("financecode", formDataVo.getFieldData("NC公司编号")!=null?formDataVo.getFieldData("NC公司编号").getStringValue():"");//NC公司编号 + jsonObject.put("oaUrl", "/seeyon/cst/flowInfo.do?summaryId="+summaryId);//路径 +// jsonObject.put("financename", CAP4FormKit.getFieldStrValue(master, "NC公司名称"));//NC公司名称 + jsonObject.put("financename", formDataVo.getFieldData("NC公司名称")!=null?formDataVo.getFieldData("NC公司名称").getStringValue():"");//NC公司名称 + jsonObject.put("fstatusflag", "0");//合同状态 +// jsonObject.put("OAbillcode", CAP4FormKit.getFieldStrValue(master, "合同管理编号"));//合同管理编号 + jsonObject.put("OAbillcode", formDataVo.getFieldData("合同管理编号")!=null?formDataVo.getFieldData("合同管理编号").getStringValue():"");//合同管理编号 +// jsonObject.put("vbillcode", CAP4FormKit.getFieldStrValue(master, "合同管理编号"));//合同管理编号 + jsonObject.put("vbillcode", formDataVo.getFieldData("合同管理编号")!=null?formDataVo.getFieldData("合同管理编号").getStringValue():"");//合同管理编号 +// String firstUnitId = CAP4FormKit.getFieldStrValue(master, "OA一级单位"); + String firstUnitId = formDataVo.getFieldData("OA一级单位")!=null?formDataVo.getFieldData("OA一级单位").getDbValue()+"":""; + System.out.println(firstUnitId); + List v3xOrgAccounts = getOrgManagerDirect().getAllAccounts(true, true, "id", Long.parseLong(firstUnitId), null); + String firstUnit = ""; + if(v3xOrgAccounts.size()>0) { + firstUnit = v3xOrgAccounts.get(0).getName(); + } + jsonObject.put("firstUnit", firstUnit);//一级部门 +// String sectionNatureId = CAP4FormKit.getFieldStrValue(master, "单位部门性质"); + String sectionNatureId = formDataVo.getFieldData("单位部门性质")!=null?formDataVo.getFieldData("单位部门性质").getDbValue()+"":""; + String sectionNatureName = EnumUtils.getEnumItemName(sectionNatureId); + jsonObject.put("sectionNature", sectionNatureName);//单位部门性质 +// jsonObject.put("contractName", CAP4FormKit.getFieldStrValue(master, "合同名称"));//合同名称 + jsonObject.put("contractName", formDataVo.getFieldData("合同名称")!=null?formDataVo.getFieldData("合同名称").getStringValue():"");//合同名称 +// jsonObject.put("vdef37", CAP4FormKit.getFieldStrValue(master, "税率"));//合同名称 + jsonObject.put("vdef37",formDataVo.getFieldData("税率")!=null?formDataVo.getFieldData("税率").getStringValue():"");//合同名称 +// jsonObject.put("vdef38", CAP4FormKit.getFieldStrValue(master, "不动产位置"));//合同名称 + jsonObject.put("vdef38", formDataVo.getFieldData("不动产位置")!=null?formDataVo.getFieldData("不动产位置").getStringValue():"");//不动产位置 +// jsonObject.put("customer", CAP4FormKit.getFieldStrValue(master, "客商编号"));//客商编号 + jsonObject.put("customer", formDataVo.getFieldData("客商编号")!=null?formDataVo.getFieldData("客商编号").getStringValue():"");//客商编号 +// jsonObject.put("khbm", CAP4FormKit.getFieldStrValue(master, "客商编号"));//客商编号 + jsonObject.put("khbm", formDataVo.getFieldData("客商编号")!=null?formDataVo.getFieldData("客商编号").getStringValue():"");//客商编号 +// jsonObject.put("khlxfs", CAP4FormKit.getFieldStrValue(master, "客商联系方式"));//客商联系方式 + jsonObject.put("khlxfs", formDataVo.getFieldData("客商联系方式")!=null?formDataVo.getFieldData("客商联系方式").getStringValue():"");//客商联系方式 +// jsonObject.put("khyhzh", CAP4FormKit.getFieldStrValue(master, "银行账号"));//银行账号 + jsonObject.put("khyhzh", formDataVo.getFieldData("银行账号")!=null?formDataVo.getFieldData("银行账号").getStringValue():"");//银行账号 +// jsonObject.put("khkhyh", CAP4FormKit.getFieldStrValue(master, "开户行"));//开户行 + jsonObject.put("khkhyh", formDataVo.getFieldData("开户行")!=null?formDataVo.getFieldData("开户行").getStringValue():"");//开户行 +// jsonObject.put("khzhmc", CAP4FormKit.getFieldStrValue(master, "账户名称"));//账户名称 + jsonObject.put("khzhmc", formDataVo.getFieldData("账户名称")!=null?formDataVo.getFieldData("账户名称").getStringValue():"");//账户名称 +// jsonObject.put("personnelid", CAP4FormKit.getFieldStrValue(master, "签章人员编码"));//签章人员编码 + jsonObject.put("personnelid", formDataVo.getFieldData("签章人员编码")!=null?formDataVo.getFieldData("签章人员编码").getStringValue():"");//签章人员编码 +// jsonObject.put("subscribedate", CAP4FormKit.getFieldStrValue(master, "签章日期"));//签字盖章日期 + jsonObject.put("subscribedate", formDataVo.getFieldData("签章日期")!=null?formDataVo.getFieldData("签章日期").getStringValue():"");//签字盖章日期 +// jsonObject.put("contractApproveDate", CAP4FormKit.getFieldStrValue(master, "签章日期"));//签字盖章日期 + jsonObject.put("contractApproveDate", formDataVo.getFieldData("签章日期")!=null?formDataVo.getFieldData("签章日期").getStringValue():"");//签字盖章日期 +// jsonObject.put("leaseholdArea", CAP4FormKit.getFieldStrValue(master, "承租面积"));//承租面积 + jsonObject.put("leaseholdArea", formDataVo.getFieldData("承租面积")!=null?formDataVo.getFieldData("承租面积").getStringValue():"");//承租面积 +// jsonObject.put("ntotalorigmny", CAP4FormKit.getFieldStrValue(master, "合同金额"));//合同金额 + jsonObject.put("ntotalorigmny", formDataVo.getFieldData("合同金额")!=null?formDataVo.getFieldData("合同金额").getStringValue():"");//合同金额 +// jsonObject.put("contractStartDate", CAP4FormKit.getFieldStrValue(master, "合同起始日期"));//合同起始日期 + jsonObject.put("contractStartDate", formDataVo.getFieldData("合同起始日期")!=null?formDataVo.getFieldData("合同起始日期").getStringValue():"");//合同起始日期 +// jsonObject.put("contractEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期"));//合同结束日期 + jsonObject.put("contractEndDate", formDataVo.getFieldData("合同结束日期")!=null?formDataVo.getFieldData("合同结束日期").getStringValue():"");//合同结束日期 +// String paymentMethodId = CAP4FormKit.getFieldStrValue(master, "缴费方式"); + String paymentMethodId = formDataVo.getFieldData("缴费方式")!=null?formDataVo.getFieldData("缴费方式").getDbValue()+"":""; + String paymentMethodValue = EnumUtils.getEnumItemName(paymentMethodId); + if("年".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "year");//缴费方式-年 + }else if ("月".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "month");//缴费方式-月 + }else if ("季".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "quarter");//缴费方式-季 + }else if ("半年".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "semiannual");//缴费方式-半年 + }else if ("一次性".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "all");//缴费方式-一次性 + } +// String zuLinType = CAP4FormKit.getFieldStrValue(master, "租赁业务类型"); + String zuLinType = formDataVo.getFieldData("租赁业务类型")!=null?formDataVo.getFieldData("租赁业务类型").getDbValue()+"":""; + String zuLinTypeName = EnumUtils.getEnumItemName(zuLinType); + if("房产".equals(zuLinTypeName)) { + jsonObject.put("vdef30", "1");//枚举:房产=1,土地=2,广告位=3 + }else if ("土地".equals(zuLinTypeName)) { + jsonObject.put("vdef30", "2");//枚举:房产=1,土地=2,广告位=3 + }else if ("广告位".equals(zuLinTypeName)) { + jsonObject.put("vdef30", "3");//枚举:房产=1,土地=2,广告位=3 + } + +// jsonObject.put("freeMonthno", CAP4FormKit.getFieldStrValue(master, "免租月数"));//免租月数 + jsonObject.put("freeMonthno", formDataVo.getFieldData("免租月数")!=null?formDataVo.getFieldData("免租月数").getStringValue():"");//免租月数 +// jsonObject.put("paymentTerm", CAP4FormKit.getFieldStrValue(master, "支付期限"));//支付期限 + jsonObject.put("paymentTerm", formDataVo.getFieldData("支付期限")!=null?formDataVo.getFieldData("支付期限").getStringValue():"");//支付期限 +// jsonObject.put("earnestMoney", CAP4FormKit.getFieldStrValue(master, "保证金"));//保证金 + jsonObject.put("earnestMoney", formDataVo.getFieldData("保证金")!=null?formDataVo.getFieldData("保证金").getStringValue():"");//保证金 +// jsonObject.put("electricityBill", CAP4FormKit.getFieldStrValue(master, "电费单价"));//电费单价 + jsonObject.put("electricityBill", formDataVo.getFieldData("电费单价")!=null?formDataVo.getFieldData("电费单价").getStringValue():"");//电费单价 +// jsonObject.put("waterBill", CAP4FormKit.getFieldStrValue(master, "水费单价"));//水费单价 + jsonObject.put("waterBill", formDataVo.getFieldData("水费单价")!=null?formDataVo.getFieldData("水费单价").getStringValue():"");//水费单价 +// jsonObject.put("paymentnum", CAP4FormKit.getFieldStrValue(master, "缴费期数"));//缴费期数 + jsonObject.put("paymentnum", formDataVo.getFieldData("缴费期数")!=null?formDataVo.getFieldData("缴费期数").getStringValue():"");//缴费期数 +// jsonObject.put("totalCost", CAP4FormKit.getFieldStrValue(master, "租费合计"));//租金合计 + jsonObject.put("totalCost", formDataVo.getFieldData("租费合计")!=null?formDataVo.getFieldData("租费合计").getStringValue():"");//租金合计 +// jsonObject.put("rentalTotal", CAP4FormKit.getFieldStrValue(master, "租费合计"));//租费合计 + jsonObject.put("rentalTotal", formDataVo.getFieldData("租费合计")!=null?formDataVo.getFieldData("租费合计").getStringValue():"");//租费合计 +// jsonObject.put("rent", CAP4FormKit.getFieldStrValue(master, "租金"));//合同金额 + jsonObject.put("rent", formDataVo.getFieldData("租金")!=null?formDataVo.getFieldData("租金").getStringValue():"");//合同金额 +// jsonObject.put("manageServiceFee", CAP4FormKit.getFieldStrValue(master, "管理服务费"));//合同金额 + jsonObject.put("manageServiceFee", formDataVo.getFieldData("管理服务费")!=null?formDataVo.getFieldData("管理服务费").getStringValue():"");//合同金额 +// jsonObject.put("marketFee", CAP4FormKit.getFieldStrValue(master, "市场管理费"));//合同金额 + jsonObject.put("marketFee",formDataVo.getFieldData("市场管理费")!=null?formDataVo.getFieldData("市场管理费").getStringValue():"");//合同金额 +// jsonObject.put("sumSub", CAP4FormKit.getFieldStrValue(master, "合计减免"));//合计减免 + jsonObject.put("sumSub", formDataVo.getFieldData("合计减免")!=null?formDataVo.getFieldData("合计减免").getStringValue():"");//合计减免 +// jsonObject.put("sumReceive", CAP4FormKit.getFieldStrValue(master, "合计应收"));//合计应收 + jsonObject.put("sumReceive", formDataVo.getFieldData("合计应收")!=null?formDataVo.getFieldData("合计应收").getStringValue():"");//合计应收 +// jsonObject.put("subStartTime", CAP4FormKit.getFieldStrValue(master, "免租期从"));//减免开始时间 + jsonObject.put("subStartTime", formDataVo.getFieldData("免租期从")!=null?formDataVo.getFieldData("免租期从").getStringValue():"");//减免开始时间 +// jsonObject.put("subEndTime", CAP4FormKit.getFieldStrValue(master, "减免结束日期"));//减免结束时间 + jsonObject.put("subEndTime", formDataVo.getFieldData("减免结束日期")!=null?formDataVo.getFieldData("减免结束日期").getStringValue():"");//减免结束时间 +// jsonObject.put("certificateCode", CAP4FormKit.getFieldStrValue(master, "房产证号"));//房产证号 + jsonObject.put("certificateCode", formDataVo.getFieldData("房产证号")!=null?formDataVo.getFieldData("房产证号").getStringValue():"");//房产证号 +// jsonObject.put("assetCode", CAP4FormKit.getFieldStrValue(master, "关联BIP房产"));//资产编号 + jsonObject.put("assetCode", formDataVo.getFieldData("关联BIP房产")!=null?formDataVo.getFieldData("关联BIP房产").getStringValue():"");//资产编号 + + JSONArray plans = new JSONArray(); +// List formDataSubBeans = CAP4FormKit.getSubBeans(master,"账期明细"); + List subFormDataVos = formDataVo.getSubFormMap().get("账期明细"); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject plan = new JSONObject(); +// plan.put("accountPeriodNum", CAP4FormKit.getSubFieldValue(formDataSubBean,"租金计算序号")); //账期数 + plan.put("accountPeriodNum", subFormDataVo.getFieldData("租金计算序号")!=null?subFormDataVo.getFieldData("租金计算序号").getStringValue():""); //账期数 +// plan.put("currentPaymentTime", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期缴费时限")); //当期缴费时限 + plan.put("currentPaymentTime", subFormDataVo.getFieldData("账期缴费时限")!=null?subFormDataVo.getFieldData("账期缴费时限").getStringValue():""); //当期缴费时限 +// plan.put("planStartDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期开始日期")); //租金计算开始时间 + plan.put("planStartDate", subFormDataVo.getFieldData("账期开始日期")!=null?subFormDataVo.getFieldData("账期开始日期").getStringValue():""); //租金计算开始时间 +// plan.put("planEndDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期结束日期")); //租金计算结束时间 + plan.put("planEndDate", subFormDataVo.getFieldData("账期结束日期")!=null?subFormDataVo.getFieldData("账期结束日期").getStringValue():""); //租金计算结束时间 +// plan.put("planAmount", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期应收租费")); //应收租费 + plan.put("planAmount", subFormDataVo.getFieldData("账期应收租费")!=null?subFormDataVo.getFieldData("账期应收租费").getStringValue():""); //应收租费 +// plan.put("rent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期应收租金")); //租费明细 + plan.put("rent", subFormDataVo.getFieldData("账期应收租金")!=null?subFormDataVo.getFieldData("账期应收租金").getStringValue():""); //租费明细 +// plan.put("manageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期应收物业费")); //租金计算管理服务费 + plan.put("manageServiceFee", subFormDataVo.getFieldData("账期应收物业费")!=null?subFormDataVo.getFieldData("账期应收物业费").getStringValue():""); //租金计算管理服务费 +// plan.put("marketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期应收市场费")); //拆分减市场费 + plan.put("marketFee", subFormDataVo.getFieldData("账期应收市场费")!=null?subFormDataVo.getFieldData("账期应收市场费").getStringValue():""); //拆分减市场费 +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已收租金")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已收租金")!=null?subFormDataVo.getFieldData("已收租金").getStringValue():"")){ + plan.put("curColRent", "0");//已收租金 + }else{ + plan.put("curColRent", subFormDataVo.getFieldData("已收租金").getStringValue());//已收租金 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已收物业管理费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已收物业管理费")!=null?subFormDataVo.getFieldData("已收物业管理费").getStringValue():"")){ + plan.put("curColProManageFee", "0");//已收物业管理费 + }else{ + plan.put("curColProManageFee", subFormDataVo.getFieldData("已收物业管理费").getStringValue());//已收物业管理费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已收市场服务费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已收市场服务费")!=null?subFormDataVo.getFieldData("已收市场服务费").getStringValue():"")){ + plan.put("curColMarManageFee", "0");//已收市场服务费 + }else{ + plan.put("curColMarManageFee", subFormDataVo.getFieldData("已收市场服务费").getStringValue());//已收市场服务费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票租金")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票租金")!=null?subFormDataVo.getFieldData("已开票租金").getStringValue():"")){ + plan.put("curBillRent", "0");//已开票租金 + }else{ + plan.put("curBillRent", subFormDataVo.getFieldData("已开票租金").getStringValue());//已开票租金 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票物业管理费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票物业管理费")!=null?subFormDataVo.getFieldData("已开票物业管理费").getStringValue():"")){ + plan.put("curBillProManageFee", "0");//已开票物业管理费 + }else{ + plan.put("curBillProManageFee", subFormDataVo.getFieldData("已开票物业管理费").getStringValue());//已开票物业管理费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票市场服务费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票市场服务费")!=null?subFormDataVo.getFieldData("已开票市场服务费").getStringValue():"")){ + plan.put("curBillMarManageFee", "0");//已开票市场服务费 + }else{ + plan.put("curBillMarManageFee", subFormDataVo.getFieldData("已开票市场服务费").getStringValue());//已开票市场服务费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票合计")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票合计")!=null?subFormDataVo.getFieldData("已开票合计").getStringValue():"")){ + plan.put("invoiceAmountFeeTotal", "0");//已开票合计 + }else{ + plan.put("invoiceAmountFeeTotal", subFormDataVo.getFieldData("已开票合计").getStringValue());//已开票合计 + } +// plan.put("detailTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期租费合计")); //租金计算-合计 + plan.put("detailTotalCost", subFormDataVo.getFieldData("账期租费合计")!=null?subFormDataVo.getFieldData("账期租费合计").getStringValue():""); //租金计算-合计 +// plan.put("detailRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期租金")); //租金计算-租金 + plan.put("detailRent", subFormDataVo.getFieldData("账期租金")!=null?subFormDataVo.getFieldData("账期租金").getStringValue():""); //租金计算-租金 +// plan.put("detailManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期物业管理费")); //租金计算-管理服务费 + plan.put("detailManageServiceFee", subFormDataVo.getFieldData("账期物业管理费")!=null?subFormDataVo.getFieldData("账期物业管理费").getStringValue():""); //租金计算-管理服务费 +// plan.put("detailMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期市场管理费")); //租金计算-市场管理费 + plan.put("detailMarketFee", subFormDataVo.getFieldData("账期市场管理费")!=null?subFormDataVo.getFieldData("账期市场管理费").getStringValue():""); //租金计算-市场管理费 +// plan.put("derateTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免合计")); //减免租金-合计 + plan.put("derateTotalCost", subFormDataVo.getFieldData("账期减免合计")!=null?subFormDataVo.getFieldData("账期减免合计").getStringValue():""); //减免租金-合计 +// plan.put("derateRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免租金")); //减免租金-租金 + plan.put("derateRent", subFormDataVo.getFieldData("账期减免租金")!=null?subFormDataVo.getFieldData("账期减免租金").getStringValue():""); //减免租金-租金 +// plan.put("derateManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免物业费")); //减免租金-管理服务费 + plan.put("derateManageServiceFee", subFormDataVo.getFieldData("账期减免物业费")!=null?subFormDataVo.getFieldData("账期减免物业费").getStringValue():""); //减免租金-管理服务费 +// plan.put("derateMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期合计递增")); //减免租金-市场管理费 + plan.put("derateMarketFee", subFormDataVo.getFieldData("账期减免市场费")!=null?subFormDataVo.getFieldData("账期合计递增").getStringValue():""); //减免租金-市场管理费 +// plan.put("increaseTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期合计递增")); //租金递增-合计 + plan.put("increaseTotalCost", subFormDataVo.getFieldData("账期合计递增")!=null?subFormDataVo.getFieldData("账期合计递增").getStringValue():""); //租金递增-合计 +// plan.put("increaseRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增租金")); //租金递增-租金 + plan.put("increaseRent", subFormDataVo.getFieldData("账期递增租金")!=null?subFormDataVo.getFieldData("账期递增租金").getStringValue():""); //租金递增-租金 +// plan.put("increaseManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增物业费")); //租金递增-管理服务费 + plan.put("increaseManageServiceFee", subFormDataVo.getFieldData("账期递增物业费")!=null?subFormDataVo.getFieldData("账期递增物业费").getStringValue():""); //租金递增-管理服务费 +// plan.put("increaseMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增市场费")); //租金递增-市场管理费 + plan.put("increaseMarketFee", subFormDataVo.getFieldData("账期递增市场费")!=null?subFormDataVo.getFieldData("账期递增市场费").getStringValue():""); //租金递增-市场管理费 +// plan.put("recipientAmount", CAP4FormKit.getSubFieldValue(formDataSubBean,"累计收款原币")); //累计收款原币 + plan.put("recipientAmount", subFormDataVo.getFieldData("累计收款原币")!=null?subFormDataVo.getFieldData("累计收款原币").getStringValue():""); //累计收款原币 + plans.add(plan); + } + jsonObject.put("plans", plans);//收款计划的集合 +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPZL_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + /** + * 获取租赁收款单并封装参数 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getLeaseContractProceedsParam(FormDataVo formDataVo,String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("oabillcode", CAP4FormKit.getFieldStrValue(master, "OA单据号"));//OA单据号 + jsonObject.put("oabillcode", formDataVo.getFieldData("OA单据号")!=null?formDataVo.getFieldData("OA单据号").getStringValue():"");//OA单据号 + jsonObject.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId);//OA单据号 +// jsonObject.put("financialOrg", CAP4FormKit.getFieldStrValue(master, "NC公司编码"));//财务组织 + jsonObject.put("financialOrg", formDataVo.getFieldData("NC公司编码")!=null?formDataVo.getFieldData("NC公司编码").getStringValue():"");//财务组织 +// jsonObject.put("billDate", CAP4FormKit.getFieldStrValue(master, "单据日期"));//单据日期 + jsonObject.put("billDate", formDataVo.getFieldData("单据日期")!=null?formDataVo.getFieldData("单据日期").getStringValue():"");//单据日期 +// jsonObject.put("customer", CAP4FormKit.getFieldStrValue(master, "客商编号"));//客户 + jsonObject.put("customer", formDataVo.getFieldData("客商编号")!=null?formDataVo.getFieldData("客商编号").getStringValue():"");//客户 +// jsonObject.put("settlementMethod", CAP4FormKit.getFieldStrValue(master, "结算方式编码"));//结算方式 + jsonObject.put("settlementMethod", formDataVo.getFieldData("结算方式编码")!=null?formDataVo.getFieldData("结算方式编码").getStringValue():"");//结算方式 +// jsonObject.put("paymentAccount", CAP4FormKit.getFieldStrValue(master, "付款银行账号"));//付款银行账户 + jsonObject.put("paymentAccount", formDataVo.getFieldData("付款银行账号")!=null?formDataVo.getFieldData("付款银行账号").getStringValue():"");//付款银行账户 +// jsonObject.put("recAccount", CAP4FormKit.getFieldStrValue(master, "收款银行账号"));//收款银行账户 + jsonObject.put("recAccount", formDataVo.getFieldData("收款银行账号")!=null?formDataVo.getFieldData("收款银行账号").getStringValue():"");//收款银行账户 +// jsonObject.put("deptid", CAP4FormKit.getFieldStrValue(master, "部门编码"));//部门编码 + jsonObject.put("deptid", formDataVo.getFieldData("部门编码")!=null?formDataVo.getFieldData("部门编码").getStringValue():"");//部门编码 +// jsonObject.put("psndoc", CAP4FormKit.getFieldStrValue(master, "经办人编码"));//业务员 + jsonObject.put("psndoc", formDataVo.getFieldData("经办人编码")!=null?formDataVo.getFieldData("经办人编码").getStringValue():"");//业务员 +// String sklxid = CAP4FormKit.getFieldStrValue(master, "收款类型"); + String sklxid = formDataVo.getFieldData("收款类型")!=null?formDataVo.getFieldData("收款类型").getDbValue()+"":""; + String sklx = getEnumManagerNew().getEnumItem(Long.parseLong(sklxid)).getEnumItemCode(); + jsonObject.put("sklx", sklx);//收款银行账户 +// String isInvoiceId = CAP4FormKit.getFieldStrValue(master, "是否开票"); + String isInvoiceId = formDataVo.getFieldData("是否开票")!=null?formDataVo.getFieldData("是否开票").getDbValue()+"":""; + String isInvoice = getEnumManagerNew().getEnumItem(Long.parseLong(isInvoiceId)).getLabel(); +// 如果选择是开发票则获取开票类型字段数据 + if("是".equals(isInvoice)){ +// String invoiceTypeId = CAP4FormKit.getFieldStrValue(master, "开票类型"); + String invoiceTypeId =formDataVo.getFieldData("开票类型")!=null?formDataVo.getFieldData("开票类型").getDbValue()+"":""; + String invoiceType = getEnumManagerNew().getEnumItem(Long.parseLong(invoiceTypeId)).getLabel(); + jsonObject.put("invoiceType", invoiceType);//开票类型 + }else { + jsonObject.put("invoiceType", "");//开票类型 + } + jsonObject.put("isInvoice", isInvoice);//是否开票(是 or 否) + List subFormDataVos = formDataVo.getSubFormMap().get("收费明细"); +// List formDataSubBeans = CAP4FormKit.getSubBeans(master); + JSONArray jsonArray = new JSONArray(); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject items = new JSONObject(); +// items.put("periodNum", CAP4FormKit.getSubFieldValue(formDataSubBean, "账期号"));//账期号 + items.put("periodNum", subFormDataVo.getFieldData("账期号")!=null?subFormDataVo.getFieldData("账期号").getStringValue():"");//账期号 +// items.put("contractCode", CAP4FormKit.getFieldStrValue(master, "租赁合同编码"));//合同编码 + items.put("contractCode", formDataVo.getFieldData("租赁合同编码")!=null?formDataVo.getFieldData("租赁合同编码").getStringValue():"");//合同编码 +// items.put("manageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean, "管理服务费"));//管理服务费 + items.put("manageServiceFee", subFormDataVo.getFieldData("管理服务费")!=null?subFormDataVo.getFieldData("管理服务费").getStringValue():"");//管理服务费 +// items.put("rent", CAP4FormKit.getSubFieldValue(formDataSubBean, "租金"));//租金 + items.put("rent", subFormDataVo.getFieldData("租金")!=null?subFormDataVo.getFieldData("租金").getStringValue():"");//租金 +// items.put("marketFee", CAP4FormKit.getSubFieldValue(formDataSubBean, "市场管理费"));//市场管理费 + items.put("marketFee", subFormDataVo.getFieldData("市场管理费")!=null?subFormDataVo.getFieldData("市场管理费").getStringValue():"");//市场管理费 +// items.put("sumReceive", CAP4FormKit.getSubFieldValue(formDataSubBean, "应收金额"));//应收金额 + items.put("sumReceive", subFormDataVo.getFieldData("应收金额")!=null?subFormDataVo.getFieldData("应收金额").getStringValue():"");//应收金额 +// items.put("sumActual", CAP4FormKit.getSubFieldValue(formDataSubBean, "本次收款金额"));//实收金额 + items.put("sumActual", subFormDataVo.getFieldData("本次收款金额")!=null?subFormDataVo.getFieldData("本次收款金额").getStringValue():"");//实收金额 +// items.put("taxRate", CAP4FormKit.getSubFieldValue(formDataSubBean, "税率"));//税率 + items.put("taxRate", subFormDataVo.getFieldData("税率")!=null?subFormDataVo.getFieldData("税率").getStringValue():"");//税率 +// items.put("localTaxCr", CAP4FormKit.getSubFieldValue(formDataSubBean, "税额"));//税额 + items.put("localTaxCr", subFormDataVo.getFieldData("税额")!=null?subFormDataVo.getFieldData("税额").getStringValue():"");//税额 +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已收租金")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已收租金")!=null?subFormDataVo.getFieldData("已收租金").getStringValue():"")){ + items.put("curColRent", "0");//已收租金 + }else{ +// items.put("curColRent", CAP4FormKit.getSubFieldValue(formDataSubBean, "已收租金"));//已收租金 + items.put("curColRent", subFormDataVo.getFieldData("已收租金")!=null?subFormDataVo.getFieldData("已收租金").getStringValue():"");//已收租金 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已收物业管理费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已收物业管理费")!=null?subFormDataVo.getFieldData("已收物业管理费").getStringValue():"")){ + items.put("curColProManageFee", "0");//已收物业管理费 + }else{ +// items.put("curColProManageFee", CAP4FormKit.getSubFieldValue(formDataSubBean, "已收物业管理费"));//已收物业管理费 + items.put("curColProManageFee", subFormDataVo.getFieldData("已收物业管理费")!=null?subFormDataVo.getFieldData("已收物业管理费").getStringValue():"");//已收物业管理费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已收市场服务费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已收物业管理费")!=null?subFormDataVo.getFieldData("已收物业管理费").getStringValue():"")){ + items.put("curColMarManageFee", "0");//已收市场服务费 + }else{ +// items.put("curColMarManageFee", CAP4FormKit.getSubFieldValue(formDataSubBean, "已收市场服务费"));//已收市场服务费 + items.put("curColMarManageFee", subFormDataVo.getFieldData("已收物业管理费")!=null?subFormDataVo.getFieldData("已收物业管理费").getStringValue():"");//已收市场服务费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票租金")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票租金")!=null?subFormDataVo.getFieldData("已开票租金").getStringValue():"")){ + items.put("curBillRent", "0");//已开票租金 + }else{ +// items.put("curBillRent", CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票租金"));//已开票租金 + items.put("curBillRent", subFormDataVo.getFieldData("已开票租金")!=null?subFormDataVo.getFieldData("已开票租金").getStringValue():"");//已开票租金 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票物业管理费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票租金")!=null?subFormDataVo.getFieldData("已开票租金").getStringValue():"")){ + items.put("curBillProManageFee", "0");//已开票物业管理费 + }else{ +// items.put("curBillProManageFee", CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票物业管理费"));//已开票物业管理费 + items.put("curBillProManageFee", subFormDataVo.getFieldData("已开票租金")!=null?subFormDataVo.getFieldData("已开票租金").getStringValue():"");//已开票物业管理费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票市场服务费")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票市场服务费")!=null?subFormDataVo.getFieldData("已开票市场服务费").getStringValue():"")){ + items.put("curBillMarManageFee", "0");//已开票市场服务费 + }else{ +// items.put("curBillMarManageFee", CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票市场服务费"));//已开票市场服务费 + items.put("curBillMarManageFee", subFormDataVo.getFieldData("已开票市场服务费")!=null?subFormDataVo.getFieldData("已开票市场服务费").getStringValue():"");//已开票市场服务费 + } +// if(CAP4FormKit.getSubFieldValue(formDataSubBean, "已开票合计")==null){ + if(StringUtil.isEmpty(subFormDataVo.getFieldData("已开票合计")!=null?subFormDataVo.getFieldData("已开票合计").getStringValue():"")){ + items.put("invoiceAmountFeeTotal", "0");//已开票合计 + }else{ + items.put("invoiceAmountFeeTotal", subFormDataVo.getFieldData("已开票合计")!=null?subFormDataVo.getFieldData("已开票合计").getStringValue():"");//已开票合计 + } +// items.put("notaxCr", CAP4FormKit.getSubFieldValue(formDataSubBean, "无税金额"));//无税金额 + items.put("notaxCr", subFormDataVo.getFieldData("无税金额")!=null?subFormDataVo.getFieldData("无税金额").getStringValue():"");//无税金额 +// String subjectCode = CAP4FormKit.getSubFieldValue(formDataSubBean, "科目大类编码").toString(); + String subjectCode = subFormDataVo.getFieldData("科目大类编码")!=null?subFormDataVo.getFieldData("科目大类编码").getStringValue():""; + subjectCode = subjectCode.substring(5); + items.put("subjectCode", subjectCode);//科目大类01-应收款项,02-预收款项 +// items.put("szxm", CAP4FormKit.getSubFieldValue(formDataSubBean, "收支项目编码"));//收支项目 + items.put("szxm", subFormDataVo.getFieldData("收支项目编码")!=null?subFormDataVo.getFieldData("收支项目编码").getStringValue():"");//收支项目 + items.put("skyw","022");//收款业务类型 +// items.put("pkPlan", CAP4FormKit.getSubFieldValue(formDataSubBean, "收款计划主键"));//收支项目 + items.put("pkPlan", subFormDataVo.getFieldData("收款计划主键")!=null?subFormDataVo.getFieldData("收款计划主键").getStringValue():"");//收支项目 + jsonArray.add(items); + } + jsonObject.put("items", jsonArray); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPZLSK_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + /** + * 获取一般收款单并封装参数 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getContractProceedsParam(FormDataVo formDataVo,String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("oabillcode", CAP4FormKit.getFieldStrValue(master, "OA单据号"));//OA单据号 + jsonObject.put("oabillcode", formDataVo.getFieldData("OA单据号")!=null?formDataVo.getFieldData("OA单据号").getStringValue():"");//OA单据号 + jsonObject.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId); +// jsonObject.put("financialOrg", CAP4FormKit.getFieldStrValue(master, "NC公司编码"));//财务组织 + jsonObject.put("financialOrg", formDataVo.getFieldData("NC公司编码")!=null?formDataVo.getFieldData("NC公司编码").getStringValue():"");//财务组织 +// jsonObject.put("billDate", CAP4FormKit.getFieldStrValue(master, "单据日期"));//单据日期 + jsonObject.put("billDate", formDataVo.getFieldData("单据日期")!=null?formDataVo.getFieldData("单据日期").getStringValue():"");//单据日期 +// jsonObject.put("customer", CAP4FormKit.getFieldStrValue(master, "客商编号"));//客户 + jsonObject.put("customer", formDataVo.getFieldData("客商编号")!=null?formDataVo.getFieldData("客商编号").getStringValue():"");//客户 +// jsonObject.put("settlementMethod", CAP4FormKit.getFieldStrValue(master, "结算方式编码"));//结算方式 + jsonObject.put("settlementMethod", formDataVo.getFieldData("结算方式编码")!=null?formDataVo.getFieldData("结算方式编码").getStringValue():"");//结算方式 +// jsonObject.put("paymentAccount", CAP4FormKit.getFieldStrValue(master, "付款银行账号"));//付款银行账户 + jsonObject.put("paymentAccount", formDataVo.getFieldData("付款银行账号")!=null?formDataVo.getFieldData("付款银行账号").getStringValue():"");//付款银行账户 +// jsonObject.put("recAccount", CAP4FormKit.getFieldStrValue(master, "收款银行账号"));//收款银行账户 + jsonObject.put("recAccount", formDataVo.getFieldData("收款银行账号")!=null?formDataVo.getFieldData("收款银行账号").getStringValue():"");//收款银行账户 +// jsonObject.put("deptid", CAP4FormKit.getFieldStrValue(master, "部门编码"));//部门编码 + jsonObject.put("deptid", formDataVo.getFieldData("部门编码")!=null?formDataVo.getFieldData("部门编码").getStringValue():"");//部门编码 +// jsonObject.put("psndoc", CAP4FormKit.getFieldStrValue(master, "经办人编码"));//业务员 + jsonObject.put("psndoc", formDataVo.getFieldData("经办人编码")!=null?formDataVo.getFieldData("经办人编码").getStringValue():"");//业务员 +// String sklxid = CAP4FormKit.getFieldStrValue(master, "收款类型"); + String sklxid = formDataVo.getFieldData("收款类型")!=null?formDataVo.getFieldData("收款类型").getDbValue()+"":""; + String sklx = getEnumManagerNew().getEnumItem(Long.parseLong(sklxid)).getEnumItemCode(); + jsonObject.put("sklx", sklx);//收款银行账户 + +// String isInvoiceId = CAP4FormKit.getFieldStrValue(master, "是否开票"); + String isInvoiceId = formDataVo.getFieldData("是否开票")!=null?formDataVo.getFieldData("是否开票").getDbValue()+"":""; + String isInvoice = getEnumManagerNew().getEnumItem(Long.parseLong(isInvoiceId)).getLabel(); +// 如果选择是开发票则获取开票类型字段数据 + if("是".equals(isInvoice)){ +// String invoiceTypeId = CAP4FormKit.getFieldStrValue(master, "开票类型"); + String invoiceTypeId = formDataVo.getFieldData("开票类型")!=null?formDataVo.getFieldData("开票类型").getDbValue()+"":""; + String invoiceType = getEnumManagerNew().getEnumItem(Long.parseLong(invoiceTypeId)).getLabel(); + jsonObject.put("invoiceType", invoiceType);//开票类型 + }else { + jsonObject.put("invoiceType", "");//开票类型 + } + jsonObject.put("isInvoice", isInvoice);//是否开票(是 or 否) +// String isStatusId = CAP4FormKit.getFieldStrValue(master, "是否终止"); + String isStatusId = formDataVo.getFieldData("是否终止")!=null?formDataVo.getFieldData("是否终止").getDbValue()+"":""; + String isStatus = getEnumManagerNew().getEnumItem(Long.parseLong(isStatusId)).getLabel(); + if("是".equals(isStatus)) { + jsonObject.put("terminationStatus", "1");//是否终止 +// jsonObject.put("terminationReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminationReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 + }else if("否".equals(isStatus)) { + jsonObject.put("terminationStatus", "0");//是否终止 + } +// List formDataSubBeans = CAP4FormKit.getSubBeans(master); + JSONArray jsonArray = new JSONArray(); +// for (FormDataSubBean formDataSubBean : formDataSubBeans) { + JSONObject items = new JSONObject(); +// items.put("periodNum", CAP4FormKit.getSubFieldValue(formDataSubBean, "账期号"));//账期号 +// items.put("contractCode", CAP4FormKit.getFieldStrValue(master, "一般合同编码"));//合同编码 + items.put("contractCode", formDataVo.getFieldData("一般合同编码")!=null?formDataVo.getFieldData("一般合同编码").getStringValue():"");//合同编码 +// items.put("manageServiceFee", CAP4FormKit.getFieldStrValue(master, "管理服务费"));//管理服务费 + items.put("manageServiceFee", formDataVo.getFieldData("管理服务费")!=null?formDataVo.getFieldData("管理服务费").getStringValue():"");//管理服务费 + items.put("rent", "0");//租金 +// items.put("sumReceive", CAP4FormKit.getFieldStrValue(master, "合同金额"));//应收金额 + items.put("sumReceive", formDataVo.getFieldData("合同金额")!=null?formDataVo.getFieldData("合同金额").getStringValue():"");//应收金额 +// items.put("sumActual", CAP4FormKit.getFieldStrValue(master, "一般合同-本次收款金额"));//实收金额 + items.put("sumActual", formDataVo.getFieldData("本次收款金额")!=null?formDataVo.getFieldData("本次收款金额").getStringValue():"");//实收金额 +// String subjectCode = CAP4FormKit.getFieldStrValue(master, "一般合同-科目大类编码"); + String subjectCode = formDataVo.getFieldData("一般合同-科目大类编码")!=null?formDataVo.getFieldData("一般合同-科目大类编码").getStringValue():""; + subjectCode = subjectCode.substring(5); + items.put("subjectCode", subjectCode);//科目大类01-应收款项,02-预收款项 +// items.put("szxm", CAP4FormKit.getFieldStrValue(master, "一般合同-收支项目编码"));//收支项目 + items.put("szxm", formDataVo.getFieldData("一般合同-收支项目编码")!=null?formDataVo.getFieldData("一般合同-收支项目编码").getStringValue():"");//收支项目 +// items.put("taxRate", CAP4FormKit.getFieldStrValue(master, "一般合同-税率"));//税率 + items.put("taxRate", formDataVo.getFieldData("一般合同-税率")!=null?formDataVo.getFieldData("一般合同-税率").getStringValue():"");//税率 +// items.put("localTaxCr", CAP4FormKit.getFieldStrValue(master, "一般合同-税额"));//税额 + items.put("localTaxCr", formDataVo.getFieldData("一般合同-税额")!=null?formDataVo.getFieldData("一般合同-税额").getStringValue():"");//税额 +// items.put("notaxCr", CAP4FormKit.getFieldStrValue(master, "一般合同-无税金额"));//无税金额 + items.put("notaxCr", formDataVo.getFieldData("一般合同-无税金额")!=null?formDataVo.getFieldData("一般合同-无税金额").getStringValue():"");//无税金额 + items.put("skyw","022");//收款业务类型 +// items.put("pkPlan", CAP4FormKit.getSubFieldValue(formDataSubBean, "收款计划主键"));//收支项目 + jsonArray.add(items); +// } + jsonObject.put("items", jsonArray); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPYBSK_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + /** + * 获取租赁合同终止接口参数封装 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getLeaseContractTerminationParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("vbillcode", CAP4FormKit.getFieldStrValue(master, "租赁合同编号"));//OA单据号 + jsonObject.put("vbillcode",formDataVo.getFieldData("租赁合同编号")!=null?formDataVo.getFieldData("租赁合同编号").getStringValue():"");//OA单据号 + jsonObject.put("vexecdate", DateUtil.format(new Date(), "yyyy-MM-dd"));//执行时间 +// jsonObject.put("terminateReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminateReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 +// String businessTypeId = CAP4FormKit.getFieldStrValue(master, "业务类型"); + String businessTypeId = formDataVo.getFieldData("业务类型")!=null?formDataVo.getFieldData("业务类型").getDbValue()+"":""; + String businessTypeValue = getEnumManagerNew().getEnumItem(Long.parseLong(businessTypeId)).getValue(); + if("1".equals(businessTypeValue)) { + jsonObject.put("businessType", "业务终止");//终止类型 + }else if("9".equals(businessTypeValue)){ + jsonObject.put("businessType", "正常终止");//终止类型 + } +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPZLZZ_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + /** + * 获取一般付款合同终止接口参数封装 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getfkContractTerminationParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("vbillcode", CAP4FormKit.getFieldStrValue(master, "付款合同编号"));//OA单据号 + jsonObject.put("vbillcode", formDataVo.getFieldData("付款合同编号")!=null?formDataVo.getFieldData("付款合同编号").getStringValue():"");//OA单据号 + jsonObject.put("vexecdate",DateUtil.format(new Date(), "yyyy-MM-dd"));//执行时间 +// jsonObject.put("terminateReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminateReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 +// String businessTypeId = CAP4FormKit.getFieldStrValue(master, "业务类型"); + String businessTypeId = formDataVo.getFieldData("业务类型")!=null?formDataVo.getFieldData("业务类型").getDbValue()+"":""; + String businessTypeValue = getEnumManagerNew().getEnumItem(Long.parseLong(businessTypeId)).getValue(); + if("1".equals(businessTypeValue)) { + jsonObject.put("businessType", "业务终止");//终止类型 + }else if("9".equals(businessTypeValue)){ + jsonObject.put("businessType", "正常终止");//终止类型 + } +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPZLZZ_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + /** + * 获取一般收款合同终止接口参数封装 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getskContractTerminationParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("vbillcode", CAP4FormKit.getFieldStrValue(master, "收款合同编号"));//OA单据号 + jsonObject.put("vbillcode", formDataVo.getFieldData("收款合同编号")!=null?formDataVo.getFieldData("收款合同编号").getStringValue():"");//OA单据号 + jsonObject.put("vexecdate", DateUtil.format(new Date(), "yyyy-MM-dd"));//执行时间 +// jsonObject.put("terminateReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminateReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 +// String businessTypeId = CAP4FormKit.getFieldStrValue(master, "业务类型"); + String businessTypeId = formDataVo.getFieldData("业务类型")!=null?formDataVo.getFieldData("业务类型").getDbValue()+"":""; + String businessTypeValue = getEnumManagerNew().getEnumItem(Long.parseLong(businessTypeId)).getValue(); + if("1".equals(businessTypeValue)) { + jsonObject.put("businessType", "业务终止");//终止类型 + }else if("9".equals(businessTypeValue)){ + jsonObject.put("businessType", "正常终止");//终止类型 + } +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPSKZZ_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + /** + * 获取租赁合同终止接口参数封装 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getLeaseContractDerateParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + JSONArray data = new JSONArray(); + List subFormDataVos = formDataVo.getSubFormMap().get("合同明细"); +// List formDataSubBeans = CAP4FormKit.getSubBeans(master); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject formDataSubBeanJson = new JSONObject(); +// formDataSubBeanJson.put("vbillcode", CAP4FormKit.getSubFieldValue(formDataSubBean,"合同编号")); + formDataSubBeanJson.put("vbillcode", subFormDataVo.getFieldData("合同编号")!=null?subFormDataVo.getFieldData("合同编号").getStringValue():""); +// formDataSubBeanJson.put("contractStartDate", CAP4FormKit.getSubFieldValue(formDataSubBean ,"合同开始时间")); + formDataSubBeanJson.put("contractStartDate", subFormDataVo.getFieldData("合同开始时间")!=null?subFormDataVo.getFieldData("合同开始时间").getStringValue():""); +// formDataSubBeanJson.put("contractEndDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"合同结束时间")); + formDataSubBeanJson.put("contractEndDate", subFormDataVo.getFieldData("合同结束时间")!=null?subFormDataVo.getFieldData("合同结束时间").getStringValue():""); +// String paymentMethodId = CAP4FormKit.getSubFieldValue(formDataSubBean,"缴费方式").toString(); + String paymentMethodId = subFormDataVo.getFieldData("缴费方式")!=null?subFormDataVo.getFieldData("缴费方式").getDbValue()+"":""; + String paymentMethodValue = EnumUtils.getEnumItemName(paymentMethodId); + if("年".equals(paymentMethodValue)) { + formDataSubBeanJson.put("paymentMethod", "year");//缴费方式-年 + }else if ("月".equals(paymentMethodValue)) { + formDataSubBeanJson.put("paymentMethod", "month");//缴费方式-月 + }else if ("季".equals(paymentMethodValue)) { + formDataSubBeanJson.put("paymentMethod", "quarter");//缴费方式-季 + }else if ("半年".equals(paymentMethodValue)) { + formDataSubBeanJson.put("paymentMethod", "semiannual");//缴费方式-半年 + }else if ("一次性".equals(paymentMethodValue)) { + formDataSubBeanJson.put("paymentMethod", "all");//缴费方式-一次性 + } +// formDataSubBeanJson.put("subStartTime", CAP4FormKit.getFieldStrValue(master, "减免合同期间从")); + formDataSubBeanJson.put("subStartTime", formDataVo.getFieldData("减免合同期间从")!=null?formDataVo.getFieldData("减免合同期间从").getStringValue():""); +// formDataSubBeanJson.put("subEndTime", CAP4FormKit.getFieldStrValue(master, "减免合同期间到")); + formDataSubBeanJson.put("subEndTime", formDataVo.getFieldData("减免合同期间到")!=null?formDataVo.getFieldData("减免合同期间到").getStringValue():""); +// formDataSubBeanJson.put("totalCost ", CAP4FormKit.getSubFieldValue(formDataSubBean,"租金合计")); + formDataSubBeanJson.put("totalCost ",subFormDataVo.getFieldData("租金合计")!=null?subFormDataVo.getFieldData("租金合计").getStringValue():""); +// formDataSubBeanJson.put("rent", CAP4FormKit.getSubFieldValue(formDataSubBean,"租金标准")); + formDataSubBeanJson.put("rent", subFormDataVo.getFieldData("租金标准")!=null?subFormDataVo.getFieldData("租金标准").getStringValue():""); +// formDataSubBeanJson.put("manageServiceFee ", CAP4FormKit.getSubFieldValue(formDataSubBean,"管理服务费标准")); + formDataSubBeanJson.put("manageServiceFee ", subFormDataVo.getFieldData("管理服务费标准")!=null?subFormDataVo.getFieldData("管理服务费标准").getStringValue():""); +// formDataSubBeanJson.put("marketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"市场管理费标准")); + formDataSubBeanJson.put("marketFee", subFormDataVo.getFieldData("市场管理费标准")!=null?subFormDataVo.getFieldData("市场管理费标准").getStringValue():""); +// formDataSubBeanJson.put("derateTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免金额合计")); + formDataSubBeanJson.put("derateTotalCost", subFormDataVo.getFieldData("减免金额合计")!=null?subFormDataVo.getFieldData("减免金额合计").getStringValue():""); +// formDataSubBeanJson.put("derateRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免租金")); + formDataSubBeanJson.put("derateRent", subFormDataVo.getFieldData("减免租金")!=null?subFormDataVo.getFieldData("减免租金").getStringValue():""); +// formDataSubBeanJson.put("derateManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免管理服务费")); + formDataSubBeanJson.put("derateManageServiceFee", subFormDataVo.getFieldData("减免管理服务费")!=null?subFormDataVo.getFieldData("减免管理服务费").getStringValue():""); +// formDataSubBeanJson.put("derateMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免市场管理费")); + formDataSubBeanJson.put("derateMarketFee", subFormDataVo.getFieldData("减免市场管理费")!=null?subFormDataVo.getFieldData("减免市场管理费").getStringValue():""); + data.add(formDataSubBeanJson); + } + jsonObject.put("data", data); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPZLJM_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + /** + * 获取租赁合同字段并封装参数 + * @param formDataVo 表单数据对象 + * @return + * @throws IOException + * @throws BusinessException + */ + public static JSONObject getUpdateLeaseContractParam(FormDataVo formDataVo,String summaryId) throws NoSuchFieldException { + JSONObject json = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("vbillCode", CAP4FormKit.getFieldStrValue(master, "合同编号"));//合同编号 + jsonObject.put("vbillCode", formDataVo.getFieldData("合同编号")!=null?formDataVo.getFieldData("合同编号").getStringValue():"");//合同编号 +// jsonObject.put("oaBillCode", CAP4FormKit.getFieldStrValue(master, "单据号"));//合同编号 + jsonObject.put("oaBillCode", formDataVo.getFieldData("单据号")!=null?formDataVo.getFieldData("单据号").getStringValue():"");//合同编号 + jsonObject.put("oaUrl", "/seeyon/cst/flowInfo.do?summaryId="+summaryId);//合同编号 +// jsonObject.put("contractName", CAP4FormKit.getFieldStrValue(master, "合同名称"));//合同名称 + jsonObject.put("contractName", formDataVo.getFieldData("合同名称")!=null?formDataVo.getFieldData("合同名称").getStringValue():"");//合同名称 +// jsonObject.put("contractStartDate", CAP4FormKit.getFieldStrValue(master, "合同起始日期"));//合同起始日期 + jsonObject.put("contractStartDate", formDataVo.getFieldData("合同起始日期")!=null?formDataVo.getFieldData("合同起始日期").getStringValue():"");//合同起始日期 +// jsonObject.put("contractEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期"));//合同结束日期 + jsonObject.put("contractEndDate", formDataVo.getFieldData("合同结束日期")!=null?formDataVo.getFieldData("合同结束日期").getStringValue():"");//合同结束日期 +// String paymentMethodId = CAP4FormKit.getFieldStrValue(master, "变更缴费方式"); + String paymentMethodId = formDataVo.getFieldData("变更缴费方式")!=null?formDataVo.getFieldData("变更缴费方式").getDbValue()+"":""; + String paymentMethodValue = EnumUtils.getEnumItemName(paymentMethodId); + if("年".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "year");//缴费方式-年 + }else if ("月".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "month");//缴费方式-月 + }else if ("季".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "quarter");//缴费方式-季 + }else if ("半年".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "semiannual");//缴费方式-半年 + }else if ("一次性".equals(paymentMethodValue)) { + jsonObject.put("paymentMethod", "all");//缴费方式-一次性 + } +// jsonObject.put("paymentnum", CAP4FormKit.getFieldStrValue(master, "变更后缴费期数"));//缴费期数 + jsonObject.put("paymentnum", formDataVo.getFieldData("变更后缴费期数")!=null?formDataVo.getFieldData("变更后缴费期数").getStringValue():"");//缴费期数 +// jsonObject.put("personnelid", CAP4FormKit.getFieldStrValue(master, "经办人编码"));//经办人编码 + jsonObject.put("personnelid", formDataVo.getFieldData("经办人编码")!=null?formDataVo.getFieldData("经办人编码").getStringValue():"");//经办人编码 +// jsonObject.put("electricityBill", CAP4FormKit.getFieldStrValue(master, "电费单价"));//电费单价 + jsonObject.put("electricityBill", formDataVo.getFieldData("电费单价")!=null?formDataVo.getFieldData("电费单价").getStringValue():"");//电费单价 +// jsonObject.put("waterBill", CAP4FormKit.getFieldStrValue(master, "水费单价"));//水费单价 + jsonObject.put("waterBill", formDataVo.getFieldData("水费单价")!=null?formDataVo.getFieldData("水费单价").getStringValue():"");//水费单价 +// jsonObject.put("khbm", CAP4FormKit.getFieldStrValue(master, "客商编号"));//客商编号 + jsonObject.put("khbm", formDataVo.getFieldData("客商编号")!=null?formDataVo.getFieldData("客商编号").getStringValue():"");//客商编号 +// jsonObject.put("khlxfs", CAP4FormKit.getFieldStrValue(master, "客商联系方式"));//客商联系方式 + jsonObject.put("khlxfs", formDataVo.getFieldData("客商联系方式")!=null?formDataVo.getFieldData("客商联系方式").getStringValue():"");//客商联系方式 +// jsonObject.put("khyhzh", CAP4FormKit.getFieldStrValue(master, "客户银行账号"));//客户银行账号 + jsonObject.put("khyhzh", formDataVo.getFieldData("客户银行账号")!=null?formDataVo.getFieldData("客户银行账号").getStringValue():"");//客户银行账号 +// jsonObject.put("khkhyh", CAP4FormKit.getFieldStrValue(master, "客户开户行"));//客户开户行 + jsonObject.put("khkhyh", formDataVo.getFieldData("客户开户行")!=null?formDataVo.getFieldData("客户开户行").getStringValue():"");//客户开户行 +// jsonObject.put("khzhmc", CAP4FormKit.getFieldStrValue(master, "客户账户名称"));//客户账户名称 + jsonObject.put("khzhmc", formDataVo.getFieldData("客户账户名称")!=null?formDataVo.getFieldData("客户账户名称").getStringValue():"");//客户账户名称 +// jsonObject.put("leaseholdArea", CAP4FormKit.getFieldStrValue(master, "变更后承租面积"));//变更后承租面积 + jsonObject.put("leaseholdArea", formDataVo.getFieldData("变更后承租面积")!=null?formDataVo.getFieldData("变更后承租面积").getStringValue():"");//变更后承租面积 +// jsonObject.put("earnestMoney", CAP4FormKit.getFieldStrValue(master, "保证金"));//保证金 + jsonObject.put("earnestMoney", formDataVo.getFieldData("保证金")!=null?formDataVo.getFieldData("保证金").getStringValue():"");//保证金 +// jsonObject.put("paymentTerm", CAP4FormKit.getFieldStrValue(master, "支付期限日"));//支付期限日 + jsonObject.put("paymentTerm", formDataVo.getFieldData("支付期限日")!=null?formDataVo.getFieldData("支付期限日").getStringValue():"");//支付期限日 + +// jsonObject.put("rentalTotal", CAP4FormKit.getFieldStrValue(master, "变更后合同金额"));//租金合计 + jsonObject.put("rentalTotal", formDataVo.getFieldData("变更后合同金额")!=null?formDataVo.getFieldData("变更后合同金额").getStringValue():"");//租金合计 +// jsonObject.put("planAmount", CAP4FormKit.getFieldStrValue(master, "变更后租费合计"));//变更后租费合计 + jsonObject.put("planAmount", formDataVo.getFieldData("变更后租费合计")!=null?formDataVo.getFieldData("变更后租费合计").getStringValue():"");//变更后租费合计 +// jsonObject.put("rent", CAP4FormKit.getFieldStrValue(master, "变更后租金"));//变更后租金 + jsonObject.put("rent", formDataVo.getFieldData("变更后租金")!=null?formDataVo.getFieldData("变更后租金").getStringValue():"");//变更后租金 +// jsonObject.put("manageServiceFee", CAP4FormKit.getFieldStrValue(master, "变更后物业服务费"));//变更后物业服务费 + jsonObject.put("manageServiceFee", formDataVo.getFieldData("变更后物业服务费")!=null?formDataVo.getFieldData("变更后物业服务费").getStringValue():"");//变更后物业服务费 +// jsonObject.put("marketFee", CAP4FormKit.getFieldStrValue(master, "变更后市场管理费"));//市场管理费 + jsonObject.put("marketFee", formDataVo.getFieldData("变更后市场管理费")!=null?formDataVo.getFieldData("变更后市场管理费").getStringValue():"");//市场管理费 + JSONArray plans = new JSONArray(); + int n = 0; +// List formDataSubBeanlishi = CAP4FormKit.getSubBeans(master,"已缴费租金账单明细"); + List formDataSubBeanlishi = formDataVo.getSubFormMap().get("已缴费租金账单明细"); + for (FormDataVo subFormDataVo : formDataSubBeanlishi) { +// if(CAP4FormKit.getSubFieldValue(formDataSubBean,"开始日期")!=null) { + if(StringUtil.isNotEmpty(subFormDataVo.getFieldData("开始日期")!=null?subFormDataVo.getFieldData("开始日期").getStringValue():"")) { + n++; + JSONObject plan = new JSONObject(); + plan.put("accountPeriodNum", n); //账期数 +// String dateStr = CAP4FormKit.getSubFieldValue(formDataSubBean,"缴费时限").toString(); + String dateStr = subFormDataVo.getFieldData("缴费时限")!=null?subFormDataVo.getFieldData("缴费时限").getStringValue():""; +// plan.put("currentPaymentTime", dateStr.substring(0, 10)); //当期缴费时限 + plan.put("currentPaymentTime", dateStr); //当期缴费时限 +// plan.put("planStartDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"开始日期")); //租金计算开始时间 + plan.put("planStartDate", subFormDataVo.getFieldData("开始日期")!=null?subFormDataVo.getFieldData("开始日期").getStringValue():""); //租金计算开始时间 +// plan.put("planEndDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"结束日期")); //租金计算结束时间 + plan.put("planEndDate", subFormDataVo.getFieldData("结束日期")!=null?subFormDataVo.getFieldData("结束日期").getStringValue():""); //租金计算结束时间 +// plan.put("planmoney", CAP4FormKit.getSubFieldValue(formDataSubBean,"应收租费")); //应收租费 + plan.put("planmoney", subFormDataVo.getFieldData("应收租费")!=null?subFormDataVo.getFieldData("应收租费").getStringValue():""); //应收租费 + +// plan.put("detailRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"租金")); //账期租金 + plan.put("detailRent", subFormDataVo.getFieldData("租金")!=null?subFormDataVo.getFieldData("租金").getStringValue():""); //账期租金 +// plan.put("detailManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"物业服务费")); //账期物业服务费 + plan.put("detailManageServiceFee", subFormDataVo.getFieldData("物业服务费")!=null?subFormDataVo.getFieldData("物业服务费").getStringValue():""); //账期物业服务费 +// plan.put("detailMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"市场管理费")); //账期市场管理费 + plan.put("detailMarketFee", subFormDataVo.getFieldData("市场管理费")!=null?subFormDataVo.getFieldData("市场管理费").getStringValue():""); //账期市场管理费 +// plan.put("detailTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"租金合计")); //账期租金合计 + plan.put("detailTotalCost", subFormDataVo.getFieldData("租金合计")!=null?subFormDataVo.getFieldData("租金合计").getStringValue():""); //账期租金合计 + +// plan.put("derateRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免租金")); //账期减免租金 + plan.put("derateRent", subFormDataVo.getFieldData("减免租金")!=null?subFormDataVo.getFieldData("减免租金").getStringValue():""); //账期减免租金 +// plan.put("derateManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免物业费")); //账期减免物业费 + plan.put("derateManageServiceFee", subFormDataVo.getFieldData("减免物业费")!=null?subFormDataVo.getFieldData("减免物业费").getStringValue():""); //账期减免物业费 +// plan.put("derateMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免市场费")); //账期减免市场费 + plan.put("derateMarketFee", subFormDataVo.getFieldData("减免市场费")!=null?subFormDataVo.getFieldData("减免市场费").getStringValue():""); //账期减免市场费 +// plan.put("derateTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"减免租金合计")); //账期减免合计 + plan.put("derateTotalCost", subFormDataVo.getFieldData("减免租金合计")!=null?subFormDataVo.getFieldData("减免租金合计").getStringValue():""); //账期减免合计 + +// plan.put("increaseRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"递增租金")); //账期递增租金 + plan.put("increaseRent", subFormDataVo.getFieldData("递增租金")!=null?subFormDataVo.getFieldData("递增租金").getStringValue():""); //账期递增租金 +// plan.put("increaseManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"递增物业费")); //账期递增物业费 + plan.put("increaseManageServiceFee", subFormDataVo.getFieldData("递增物业费")!=null?subFormDataVo.getFieldData("递增物业费").getStringValue():""); //账期递增物业费 +// plan.put("increaseMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"递增市场费")); //账期递增市场费 + plan.put("increaseMarketFee", subFormDataVo.getFieldData("递增市场费")!=null?subFormDataVo.getFieldData("递增市场费").getStringValue():""); //账期递增市场费 +// plan.put("increaseTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"递增租金合计")); //账期递增合计 + plan.put("increaseTotalCost", subFormDataVo.getFieldData("递增租金合计")!=null?subFormDataVo.getFieldData("递增租金合计").getStringValue():""); //账期递增合计 + plans.add(plan); + } + } +// List formDataSubBeans = CAP4FormKit.getSubBeans(master,"变更后租费账单"); + List formDataSubBeans = formDataVo.getSubFormMap().get("变更后租费账单"); + for (FormDataVo subFormDataVo : formDataSubBeans) { +// if(CAP4FormKit.getSubFieldValue(formDataSubBean,"账期开始日期")!=null) { + if(StringUtil.isNotEmpty(subFormDataVo.getFieldData("账期开始日期")!=null?subFormDataVo.getFieldData("账期开始日期").getStringValue():"")) { + n++; + JSONObject plan = new JSONObject(); + plan.put("accountPeriodNum", n); //账期数 +// String dateStr = CAP4FormKit.getSubFieldValue(formDataSubBean,"账期缴费时限").toString(); + String dateStr = subFormDataVo.getFieldData("账期缴费时限")!=null?subFormDataVo.getFieldData("账期缴费时限").getStringValue():""; +// plan.put("currentPaymentTime", dateStr.substring(0, 10)); //当期缴费时限 + plan.put("currentPaymentTime", dateStr); //当期缴费时限 +// plan.put("planStartDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期开始日期")); //租金计算开始时间 + plan.put("planStartDate", subFormDataVo.getFieldData("账期开始日期")!=null?subFormDataVo.getFieldData("账期开始日期").getStringValue():""); //租金计算开始时间 +// plan.put("planEndDate", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期结束日期")); //租金计算结束时间 + plan.put("planEndDate", subFormDataVo.getFieldData("账期结束日期")!=null?subFormDataVo.getFieldData("账期结束日期").getStringValue():""); //租金计算结束时间 +// plan.put("planmoney", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期应收租费")); //应收租费 + plan.put("planmoney", subFormDataVo.getFieldData("账期应收租费")!=null?subFormDataVo.getFieldData("账期应收租费").getStringValue():""); //应收租费 + +// plan.put("detailRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期租金")); //账期租金 + plan.put("detailRent", subFormDataVo.getFieldData("账期租金")!=null?subFormDataVo.getFieldData("账期租金").getStringValue():""); //账期租金 +// plan.put("detailManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期物业服务费")); //账期物业服务费 + plan.put("detailManageServiceFee", subFormDataVo.getFieldData("账期物业服务费")!=null?subFormDataVo.getFieldData("账期物业服务费").getStringValue():""); //账期物业服务费 +// plan.put("detailMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期市场管理费")); //账期市场管理费 + plan.put("detailMarketFee", subFormDataVo.getFieldData("账期市场管理费")!=null?subFormDataVo.getFieldData("账期市场管理费").getStringValue():""); //账期市场管理费 +// plan.put("detailTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期租金合计")); //账期租金合计 + plan.put("detailTotalCost",subFormDataVo.getFieldData("账期租金合计")!=null?subFormDataVo.getFieldData("账期租金合计").getStringValue():""); //账期租金合计 + +// plan.put("derateRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免租金")); //账期减免租金 + plan.put("derateRent", subFormDataVo.getFieldData("账期减免租金")!=null?subFormDataVo.getFieldData("账期减免租金").getStringValue():""); //账期减免租金 +// plan.put("derateManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免物业费")); //账期减免物业费 + plan.put("derateManageServiceFee", subFormDataVo.getFieldData("账期减免物业费")!=null?subFormDataVo.getFieldData("账期减免物业费").getStringValue():""); //账期减免物业费 +// plan.put("derateMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免市场费")); //账期减免市场费 + plan.put("derateMarketFee", subFormDataVo.getFieldData("账期减免市场费")!=null?subFormDataVo.getFieldData("账期减免市场费").getStringValue():""); //账期减免市场费 +// plan.put("derateTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期减免合计")); //账期减免合计 + plan.put("derateTotalCost", subFormDataVo.getFieldData("账期减免合计")!=null?subFormDataVo.getFieldData("账期减免合计").getStringValue():""); //账期减免合计 + +// plan.put("increaseRent", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增租金")); //账期递增租金 + plan.put("increaseRent", subFormDataVo.getFieldData("账期递增租金")!=null?subFormDataVo.getFieldData("账期递增租金").getStringValue():""); //账期递增租金 +// plan.put("increaseManageServiceFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增物业费")); //账期递增物业费 + plan.put("increaseManageServiceFee", subFormDataVo.getFieldData("账期递增物业费")!=null?subFormDataVo.getFieldData("账期递增物业费").getStringValue():""); //账期递增物业费 +// plan.put("increaseMarketFee", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增市场费")); //账期递增市场费 + plan.put("increaseMarketFee", subFormDataVo.getFieldData("账期递增市场费")!=null?subFormDataVo.getFieldData("账期递增市场费").getStringValue():""); //账期递增市场费 +// plan.put("increaseTotalCost", CAP4FormKit.getSubFieldValue(formDataSubBean,"账期递增合计")); //账期递增合计 + plan.put("increaseTotalCost", subFormDataVo.getFieldData("账期递增合计")!=null?subFormDataVo.getFieldData("账期递增合计").getStringValue():""); //账期递增合计 + plans.add(plan); + } + } + jsonObject.put("plans", plans);//收款计划的集合 + jsonArray.add(jsonObject); + json.put("data", jsonArray); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPZLBG_" + date + ".json"), json.toString(), "UTF-8"); + return json; + } + + + /** + * 生成租金账单调用接口参数 + * @param map + * @return + * @throws IOException + */ + public static JSONObject getPaymentplandetailParam(Map map) throws IOException { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("contractCode", map.get("contractCode")); + jsonObject.put("contractStartDate", map.get("contractStartDate")); + jsonObject.put("contractEndDate", map.get("contractEndDate")); + System.out.println(map.get("paymentMethod")); + String paymentMethodId = map.get("paymentMethod").toString(); + String paymentMethodValue = EnumUtils.getEnumItemName(paymentMethodId); + String paymentMethod = ""; + if("一次性".equals(paymentMethodValue)) { + paymentMethod = "all"; + }else if("年".equals(paymentMethodValue)) { + paymentMethod = "year"; + }else if("半年".equals(paymentMethodValue)) { + paymentMethod = "semiannual"; + }else if("季".equals(paymentMethodValue)) { + paymentMethod = "quarter"; + }else if("月".equals(paymentMethodValue)) { + paymentMethod = "month"; + } + jsonObject.put("paymentMethod", paymentMethod); + jsonObject.put("paymentTerm", map.get("paymentTerm")); + jsonObject.put("totalCost", map.get("totalCost")); + jsonObject.put("rent", map.get("rent")); + jsonObject.put("manageServiceFee", map.get("manageServiceFee")); + jsonObject.put("marketFee", map.get("marketFee")); + + String str = SystemEnvironment.getApplicationFolder(); + String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPHTJS_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + /** + * 变更流程生成租金账单调用接口参数 + * @param map + * @return + * @throws IOException + */ + public static JSONObject getfctChangeplandetailParam(Map map,String endDate,int size) throws IOException { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("contractCode", map.get("contractCode")); + if(size>0) { + String year = endDate.substring(0,4); + String month = endDate.substring(5,7); + String day = endDate.substring(8,10); + LocalDate localDate = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); + localDate = localDate.plusDays(1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + endDate = localDate.format(formatter); + } + jsonObject.put("contractStartDate", endDate); + jsonObject.put("contractEndDate", map.get("contractEndDate")); + String paymentMethodId = map.get("paymentMethod").toString(); + String paymentMethodValue = EnumUtils.getEnumItemName(paymentMethodId); + String paymentMethod = ""; + if("一次性".equals(paymentMethodValue)) { + paymentMethod = "all"; + }else if("年".equals(paymentMethodValue)) { + paymentMethod = "year"; + }else if("半年".equals(paymentMethodValue)) { + paymentMethod = "semiannual"; + }else if("季".equals(paymentMethodValue)) { + paymentMethod = "quarter"; + }else if("月".equals(paymentMethodValue)) { + paymentMethod = "month"; + } + jsonObject.put("paymentMethod", paymentMethod); + jsonObject.put("paymentTerm", map.get("paymentTerm")); + jsonObject.put("totalCost", map.get("totalCost")); + jsonObject.put("rent", map.get("rent")); + jsonObject.put("manageServiceFee", map.get("manageServiceFee")); + jsonObject.put("marketFee", map.get("marketFee")); + + String str = SystemEnvironment.getApplicationFolder(); + String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPBGJS_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + /** + * 获取付款单并封装参数 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getCntractPaymentNodeParam(FormDataVo formDataVo, String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); + +// jsonObject.put("psndoccode", CAP4FormKit.getFieldStrValue(master, "经办人编码"));//业务员 + jsonObject.put("psndoccode", formDataVo.getFieldData("经办人编码")!=null?formDataVo.getFieldData("经办人编码").getStringValue():"");//业务员 +// jsonObject.put("businessdate", CAP4FormKit.getFieldStrValue(master, "单据日期"));//单据日期 + jsonObject.put("businessdate", formDataVo.getFieldData("单据日期")!=null?formDataVo.getFieldData("单据日期").getStringValue():"");//单据日期 +// jsonObject.put("orgcode", CAP4FormKit.getFieldStrValue(master, "公司编号"));//应付财务组织 + jsonObject.put("orgcode", formDataVo.getFieldData("公司编号")!=null?formDataVo.getFieldData("公司编号").getStringValue():"");//应付财务组织 +// jsonObject.put("skbankcode", CAP4FormKit.getFieldStrValue(master, "收款银行账号"));//收款银行账号 + jsonObject.put("skbankcode", formDataVo.getFieldData("收款银行账号")!=null?formDataVo.getFieldData("收款银行账号").getStringValue():"");//收款银行账号 + jsonObject.put("path", "/seeyon/cst/flowInfo.do?summaryId="+summaryId);//OA单据路径 +// jsonObject.put("oabillcode", CAP4FormKit.getFieldStrValue(master, "单据流水号"));//OA来源单据号 + jsonObject.put("oabillcode", formDataVo.getFieldData("单据流水号")!=null?formDataVo.getFieldData("单据流水号").getStringValue():"");//OA来源单据号 +// jsonObject.put("Field0006", CAP4FormKit.getFieldStrValue(master, "原始单据数"));//附件张数 + jsonObject.put("Field0006", formDataVo.getFieldData("原始单据数")!=null?formDataVo.getFieldData("原始单据数").getStringValue():"");//附件张数 +// jsonObject.put("suppliercode", CAP4FormKit.getFieldStrValue(master, "收款单位编号"));//收款单位编号 + jsonObject.put("suppliercode", formDataVo.getFieldData("收款单位编号")!=null?formDataVo.getFieldData("收款单位编号").getStringValue():"");//收款单位编号 +// jsonObject.put("fkbankcode", CAP4FormKit.getFieldStrValue(master, "付款银行账号"));//付款银行账号 + jsonObject.put("fkbankcode", formDataVo.getFieldData("付款银行账号")!=null?formDataVo.getFieldData("付款银行账号").getStringValue():"");//付款银行账号 +// jsonObject.put("yt", CAP4FormKit.getFieldStrValue(master, "用途"));//用途 + jsonObject.put("yt", formDataVo.getFieldData("用途")!=null?formDataVo.getFieldData("用途").getStringValue():"");//用途 +// jsonObject.put("phonenum", CAP4FormKit.getFieldStrValue(master, "推送人手机号码"));//用途 + jsonObject.put("phonenum", formDataVo.getFieldData("推送人手机号码")!=null?formDataVo.getFieldData("推送人手机号码").getStringValue():"");//用途 +// String wldxid = CAP4FormKit.getFieldStrValue(master, "往来对象"); + String wldxid = formDataVo.getFieldData("往来对象")!=null?formDataVo.getFieldData("往来对象").getDbValue()+"":""; + String wldxcode = getEnumManagerNew().getEnumItem(Long.parseLong(wldxid)).getEnumItemCode(); + String wldx = wldxcode.substring(5); + jsonObject.put("wldx", wldx);//往来对象(是1供应商必填 是3 业务员必填) +// jsonObject.put("fklx", CAP4FormKit.getFieldStrValue(master, "付款类型编码"));//付款类型 +// jsonObject.put("def14", CAP4FormKit.getFieldStrValue(master, "合同编号"));//合同号 + jsonObject.put("def14", formDataVo.getFieldData("合同编号")!=null?formDataVo.getFieldData("合同编号").getStringValue():"");//合同号 +// String busitypeid = CAP4FormKit.getFieldStrValue(master, "业务流程"); + String busitypeid = formDataVo.getFieldData("业务流程")!=null?formDataVo.getFieldData("业务流程").getDbValue()+"":""; + String busitypeEnumCode= getEnumManagerNew().getEnumItem(Long.parseLong(busitypeid)).getEnumItemCode(); + String busitypecode = busitypeEnumCode.substring(5); + if("AP08".equals(busitypecode)){//付款类型 + jsonObject.put("fklx", "D3"); + }else if("AP09".equals(busitypecode)){ + jsonObject.put("fklx", "F3-Cxx-02"); + }else if("AP10".equals(busitypecode)) { + jsonObject.put("fklx", "F3-Cxx-01"); + } + jsonObject.put("busitypecode", busitypecode);//业务流程编码 +// String isStatusId = CAP4FormKit.getFieldStrValue(master, "是否终止"); + String isStatusId = formDataVo.getFieldData("是否终止")!=null?formDataVo.getFieldData("是否终止").getDbValue()+"":""; + String isStatus = getEnumManagerNew().getEnumItem(Long.parseLong(isStatusId)).getLabel(); + if("是".equals(isStatus)) { + jsonObject.put("terminationStatus", "1");//是否终止是否终止,1:终止,0:非终止 +// jsonObject.put("terminationReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminationReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 + + }else if("否".equals(isStatus)) { + jsonObject.put("terminationStatus", "0");//是否终止是否终止,1:终止,0:非终止 + } +// List formDataSubBeans = CAP4FormKit.getSubBeans(master,"结算单明细"); + List subFormDataVos = formDataVo.getSubFormMap().get("结算单明细"); + JSONArray jsonArray = new JSONArray(); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject data = new JSONObject(); +// data.put("scomment", CAP4FormKit.getSubFieldValue(formDataSubBean, "摘要内容"));//摘要 + data.put("scomment", subFormDataVo.getFieldData("摘要内容")!=null?subFormDataVo.getFieldData("摘要内容").getStringValue():"");//摘要 +// data.put("field0120", CAP4FormKit.getSubFieldValue(formDataSubBean, "税率"));//税率 + data.put("field0120", subFormDataVo.getFieldData("税率")!=null?subFormDataVo.getFieldData("税率").getStringValue():"");//税率 +// data.put("money", CAP4FormKit.getSubFieldValue(formDataSubBean, "付款原币金额"));//原币金额 + data.put("money", subFormDataVo.getFieldData("付款原币金额")!=null?subFormDataVo.getFieldData("付款原币金额").getStringValue():"");//原币金额 +// data.put("kmdl", CAP4FormKit.getSubFieldValue(formDataSubBean, "科目大类编号"));//科目大类 + data.put("kmdl", subFormDataVo.getFieldData("科目大类编号")!=null?subFormDataVo.getFieldData("科目大类编号").getStringValue():"");//科目大类 +// data.put("szxm", CAP4FormKit.getSubFieldValue(formDataSubBean, "收支项目编号"));//收支项目 + data.put("szxm", subFormDataVo.getFieldData("收支项目编号")!=null?subFormDataVo.getFieldData("收支项目编号").getStringValue():"");//收支项目 +// data.put("field0119", CAP4FormKit.getSubFieldValue(formDataSubBean, "无税金额"));//税后 + data.put("field0119", subFormDataVo.getFieldData("无税金额")!=null?subFormDataVo.getFieldData("无税金额").getStringValue():"");//税后 + data.put("fkyw", "OA");//付款业务类型 +// data.put("jsfs", CAP4FormKit.getSubFieldValue(formDataSubBean, "结算方式编号"));//付款业务类型 + data.put("jsfs", subFormDataVo.getFieldData("结算方式编号")!=null?subFormDataVo.getFieldData("结算方式编号").getStringValue():"");//付款业务类型 +// data.put("field0121", CAP4FormKit.getSubFieldValue(formDataSubBean, "税额"));//税额 + data.put("field0121", subFormDataVo.getFieldData("税额")!=null?subFormDataVo.getFieldData("税额").getStringValue():"");//税额 + jsonArray.add(data); + } + jsonObject.put("data", jsonArray); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/LeaseContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPHTFK_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + + + +} + + + + +//jsonObject.put("financialOrg", CAP4FormKit.getFieldStrValue(master, "NC公司名称"));//财务组织 +//jsonObject.put("contractCode", CAP4FormKit.getFieldStrValue(master, "合同管理编号"));//合同编码 +//jsonObject.put("contractName", CAP4FormKit.getFieldStrValue(master, "合同名称"));//合同名称 +//jsonObject.put("billCode", CAP4FormKit.getFieldStrValue(master, "单据编号"));//单据编号 +//jsonObject.put("contractApproveDate", CAP4FormKit.getFieldStrValue(master, "签章日期"));//签字盖章日期 +//jsonObject.put("contractStartDate", CAP4FormKit.getFieldStrValue(master, "合同起始日期"));//合同起始日期 +//jsonObject.put("contractEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期"));//合同结束日期 +//String paymentMethodId = CAP4FormKit.getFieldStrValue(master, "缴费方式"); +//String paymentMethodValue = EnumUtils.getEnumItemName(paymentMethodId); +//if("年".equals(paymentMethodValue)) { +// jsonObject.put("paymentMethod", "year");//缴费方式-年 +//}else if ("月".equals(paymentMethodValue)) { +// jsonObject.put("paymentMethod", "month");//缴费方式-月 +//}else if ("季".equals(paymentMethodValue)) { +// jsonObject.put("paymentMethod", "quarter");//缴费方式-季 +//}else if ("半年".equals(paymentMethodValue)) { +// jsonObject.put("paymentMethod", "semiannua");//缴费方式-半年 +//}else if ("一次性".equals(paymentMethodValue)) { +// jsonObject.put("paymentMethod", "all");//缴费方式-一次性 +//} +//jsonObject.put("paymentTerm", CAP4FormKit.getFieldStrValue(master, "支付期限"));//支付期限日 +//jsonObject.put("totalCost", CAP4FormKit.getFieldStrValue(master, "租费合计"));//租费合计 +//jsonObject.put("rent", CAP4FormKit.getFieldStrValue(master, "租金"));//租金 +//jsonObject.put("manageServiceFee", CAP4FormKit.getFieldStrValue(master, "管理服务费"));//管理服务费 +//jsonObject.put("marketFee", CAP4FormKit.getFieldStrValue(master, "免租明细-免市场管理费合计"));//市场费 +//jsonObject.put("customer", CAP4FormKit.getFieldStrValue(master, "客商编号"));//客户 diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/servlet/LeaseContractServlet.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/servlet/LeaseContractServlet.java new file mode 100644 index 0000000..efdabd3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/servlet/LeaseContractServlet.java @@ -0,0 +1,189 @@ +package com.seeyon.apps.src_contract.lease.servlet; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_contract.lease.dao.ILeaseContractDao; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.FormExportUtil; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.apps.src_contract.lease.util.RentCalculationUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +public class LeaseContractServlet extends HttpServlet{ + +private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManager() { + if (this.enumManagerNew == null) { + this.enumManagerNew = ((EnumManager)AppContext.getBean("enumManagerNew")); + } + return enumManagerNew; + } + + private FormFactory formFactory; + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + +private ILeaseContractDao leaseContractDao; + + public ILeaseContractDao getLeaseContractDao() { + if (leaseContractDao == null) { + leaseContractDao = (ILeaseContractDao) AppContext.getBean("leaseContractDao"); + } + return leaseContractDao; + } + + public void setLeaseContractDao(ILeaseContractDao leaseContractDao) { + this.leaseContractDao = leaseContractDao; + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException{ +// 获取请求参数 + ServletOutputStream servletout = response.getOutputStream(); + InputStream servletin = request.getInputStream(); + byte[] bytes = new byte[request.getContentLength()]; + servletin.read(bytes); +// 将钉钉传递的参数转换成String格式 + String str = new String(bytes, "utf-8"); + String[] strs = str.split("&"); +// 将String转换成json + Map paramMap = new HashMap(); + for(int i = 0 ; i < strs.length ; i++) { + String[] param = strs[i].split("="); + if(param.length != 1 ) { + paramMap.put(param[0], param[1]); + } + } + System.out.println(paramMap); + Map map = new HashMap<>(); + String contractCode = paramMap.get("contractCode").toString(); +// 删除合同编号为租赁合同的主表和明细表数据 + if("".equals(contractCode)) { + map.put("isSucceed", "200"); + map.put("msg","请填写合同编号"); + }else { + try { + int i = getLeaseContractDao().daleteFZLeaseSub(contractCode); + Thread.sleep(1000); + int n = getLeaseContractDao().daleteFZLease(contractCode); + } catch (BusinessException | SQLException | InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + JSONObject jsonObject = LeaseContractParam.getPaymentplandetailParam(paramMap); + System.out.println(jsonObject); + JSONObject headerer = HeaderUtil.getHeader(); + JSONObject res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.PAYMENTPLANDETAILURL), headerer); + System.out.println(res); + if(!res.isEmpty()) { + String isStatus = res.get("status").toString(); + if(!"1".equals(isStatus)) { + map.put("isSucceed", "200"); + map.put("msg","租金明细生成失败:"+res.getString("msg")); + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + return ; + } + }else { + map.put("isSucceed", "200"); + map.put("msg","租金明细生成失败请联系管理员处理"); + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + return ; + } + RentCalculationUtil rentCalculationUtil = new RentCalculationUtil(); + List> sublist = new ArrayList>(); + sublist = rentCalculationUtil.handleCollectionSub(res.getJSONArray("data")); + Map mainmap = new HashMap(); + mainmap.put("单据编号", paramMap.get("contractCode")); + + FormExportUtil formExportUtil = new FormExportUtil(); + FormExport formExport = new FormExport(); + List subordinateFormExports = formExportUtil.setSubordinateFormValue(sublist); + List valueExports = formExportUtil.setFormValue(mainmap); + formExport.setSubordinateForms(subordinateFormExports); + formExport.setValues(valueExports); + try { +// getFormFactory().importBusinessFormData("shenxian", "FZZJJS", +// formExport, new String[] {}); + getFormFactory().importBusinessFormData("oatest2", "FZZJJS", + formExport, new String[] {}); + } catch (ServiceException e) { + e.printStackTrace(); + map.put("isSucceed", "200"); + map.put("msg","租金明细生成失败请联系管理员处理"); + } + if(sublist.size()>0) { + //成功计算租金,则删除当前存在的租金计算数据 + map.put("isSucceed", "200"); + map.put("msg","计算成功"); + }else { + //租金计算失败,则创建返回数据,提示前台 + map.put("isSucceed", "200"); + map.put("msg","计算失败,请检查合同主体数据"); + } + + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + } + + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ + doGet(request,response); + } + + + public void init() throws ServletException { } + + public void destroy() { + super.destroy(); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/servlet/UpdateLeaseContractServlet.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/servlet/UpdateLeaseContractServlet.java new file mode 100644 index 0000000..abfcf75 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/servlet/UpdateLeaseContractServlet.java @@ -0,0 +1,202 @@ +package com.seeyon.apps.src_contract.lease.servlet; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_contract.lease.dao.ILeaseContractDao; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.param.LeaseContractParam; +import com.seeyon.apps.src_contract.lease.util.FormExportUtil; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.apps.src_contract.lease.util.RentCalculationUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +public class UpdateLeaseContractServlet extends HttpServlet{ + +private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + public EnumManager getEnumManager() { + if (this.enumManagerNew == null) { + this.enumManagerNew = ((EnumManager)AppContext.getBean("enumManagerNew")); + } + return enumManagerNew; + } + + private FormFactory formFactory; + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + +private ILeaseContractDao leaseContractDao; + + public ILeaseContractDao getLeaseContractDao() { + if (leaseContractDao == null) { + leaseContractDao = (ILeaseContractDao) AppContext.getBean("leaseContractDao"); + } + return leaseContractDao; + } + + public void setLeaseContractDao(ILeaseContractDao leaseContractDao) { + this.leaseContractDao = leaseContractDao; + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException{ +// 获取请求参数 + ServletOutputStream servletout = response.getOutputStream(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + InputStream servletin = request.getInputStream(); + byte[] bytes = new byte[request.getContentLength()]; + servletin.read(bytes); +// 将钉钉传递的参数转换成String格式 + String str = new String(bytes, "utf-8"); + String[] strs = str.split("&"); +// 将String转换成json + Map paramMap = new HashMap(); + for(int i = 0 ; i < strs.length ; i++) { + String[] param = strs[i].split("="); + if(param.length != 1 ) { + paramMap.put(param[0], param[1]); + } + } + System.out.println(paramMap); + Map map = new HashMap<>(); + String contractCode = paramMap.get("contractCode").toString(); +// 删除合同编号为租赁合同的主表和明细表数据 + if("".equals(contractCode)) { + map.put("isSucceed", "200"); + map.put("msg","请填写合同编号"); + }else { +// 根据合同编号清除辅助表信息 + try { + int i = getLeaseContractDao().daleteFZLeaseSub(contractCode); + Thread.sleep(1000); + int n = getLeaseContractDao().daleteFZLease(contractCode); + } catch (BusinessException | SQLException | InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +// 获取合同编号,查询已缴纳账期数据。 + List> historyPayments =leaseContractDao.historyPayment(contractCode); + String endDate = ""; + if(historyPayments.size()>0) { + Map historyPayment = historyPayments.get(historyPayments.size()-1); + endDate = historyPayment.get("ENDDATE").toString(); + }else { + endDate = paramMap.get("contractStartDate").toString(); + + } + JSONObject jsonObject = LeaseContractParam.getfctChangeplandetailParam(paramMap,endDate,historyPayments.size()); + JSONObject headerer = HeaderUtil.getHeader(); + JSONObject res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.FCTCHANGEPLANDETAILURL), headerer); + if(!res.isEmpty()) { + String isStatus = res.get("status").toString(); + if(!"1".equals(isStatus)) { + map.put("isSucceed", "200"); + map.put("msg","租金明细生成失败:"+res.getString("msg")); + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + return ; + } + }else { + map.put("isSucceed", "200"); + map.put("msg","租金明细生成失败请联系管理员处理"); + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + return ; + } + RentCalculationUtil rentCalculationUtil = new RentCalculationUtil(); + List> sublist = new ArrayList>(); + sublist = rentCalculationUtil.updateCollectionSub(historyPayments,res.getJSONArray("data")); + Map mainmap = new HashMap(); + mainmap.put("单据编号", paramMap.get("contractCode")); + + FormExportUtil formExportUtil = new FormExportUtil(); + FormExport formExport = new FormExport(); + List subordinateFormExports = formExportUtil.setSubordinateFormValue(sublist); + List valueExports = formExportUtil.setFormValue(mainmap); + formExport.setSubordinateForms(subordinateFormExports); + formExport.setValues(valueExports); + try { +// getFormFactory().importBusinessFormData("shenxian", "FZZJJS", +// formExport, new String[] {}); + getFormFactory().importBusinessFormData("oatest2", "FZZJJS", + formExport, new String[] {}); + } catch (ServiceException e) { + e.printStackTrace(); + map.put("isSucceed", "200"); + map.put("msg","租金明细生成失败请联系管理员处理"); + } + if(sublist.size()>0) { + //成功计算租金,则删除当前存在的租金计算数据 + map.put("isSucceed", "200"); + map.put("msg","计算成功"); + }else { + //租金计算失败,则创建返回数据,提示前台 + map.put("isSucceed", "200"); + map.put("msg","计算失败,请检查合同主体数据"); + } + + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + } + + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ + doGet(request,response); + } + + + public void init() throws ServletException { } + + public void destroy() { + super.destroy(); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/BaseUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/BaseUtil.java new file mode 100644 index 0000000..5707012 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/BaseUtil.java @@ -0,0 +1,110 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + + +/** + * sql执行工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ +public class BaseUtil { + + + PreparedStatement ps = null; + ResultSet res = null; + Connection conn =null; + /** + * sql查询工具 + * @param sql sql语句 + * @param params sql参数 + * @return 结果集 + */ + public ResultSet executeQuery(String sql, Object[] params) + { + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++){ + ps.setObject(i+1, params[i]); + } + res = ps.executeQuery(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return res; + } + /** + * sql更新工具 + * @param sql + * @param params + * @return + */ + public int executeUpdate(String sql, Object[] params) + { + int res = 0; + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++) + { + ps.setObject(i+1, params[i]); + } + res = ps.executeUpdate(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return res; + } + + + public void close() { + release(res,null,conn,ps); + } + //定义一个释放资源的方法; + /* + * 定义一个方法: 释放资源: 直接将rs stmt conn 全部释放: + */ + public static void release(ResultSet rs ,Statement stmt , Connection conn,PreparedStatement ps){ + if(rs!=null){ + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + rs=null; + } + if(stmt!=null){ + try { + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + stmt=null; + } + if(conn!=null){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + conn=null; + } + if(ps!=null){ + try { + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + ps=null; + } + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/DateGapUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/DateGapUtil.java new file mode 100644 index 0000000..721ce1d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/DateGapUtil.java @@ -0,0 +1,163 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +public class DateGapUtil { + + /** + * 计算两个日期之间相差多少年多少月多少日 + * @param startDate + * @param endDate + * @return + * @throws ParseException + */ + public static String getYearMonthDayGap(String startDate,String endDate) throws ParseException { + int reyear = 0; + int remonth = 0; +// 设置第一个日期 + String str1 = startDate; +// 获取第二个日期 + String str2 = endDate; +// 设置日期格式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); +// 将字符串转换成日期 + Date start = sdf.parse(str1); + Date end = sdf.parse(str2); + Date d3 = null; + if(start.getTime()-end.getTime()>0){ + d3 = start; + start = end; + end = d3; + } + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(start); + c2.setTime(end); +// 由于输入的时候结束日期少一天通过代码计算则需要加上此天 + c2.add(Calendar.DATE, 1); + int year1 = c1.get(Calendar.YEAR); + int year2 = c2.get(Calendar.YEAR); + int month1 = c1.get(Calendar.MONTH); + int month2 = c2.get(Calendar.MONTH); + int day1 = c1.get(Calendar.DAY_OF_MONTH); + int day2 = c2.get(Calendar.DAY_OF_MONTH); + int yearInterval = year1 - year2; + if (month1 < month2 || month1 == month2 && day1 < day2) + yearInterval--; + int monthInterval = (month1 + 12) - month2; + if (day1 < day2) + monthInterval--; + monthInterval %= 12; + int monthsDiff = Math.abs(yearInterval * 12 + monthInterval); + int nian = monthsDiff/12; + int yue = monthsDiff - (nian*12); + c1.add(Calendar.YEAR, nian); + if(day1==day2){ +// System.out.println(nian+"年"); + reyear = nian; +// System.out.println(yue+"月"); + remonth = yue; + c1.add(Calendar.MONTH, yue); + }else { + c1.add(Calendar.MONTH, yue-1); + if(yue-1<0) { + nian--; + yue=11; + }else { + yue =yue-1; + } +// System.out.println(nian+"年"); + reyear = nian; +// System.out.println(yue+"月"); + remonth = yue; +// c1.add(Calendar.MONTH, yue); + } + Date dt1 = c1.getTime(); + long l = dt1.getTime() - c2.getTime().getTime(); + long tian = l/-(24*60*60*1000); +// System.out.println(tian+"天"); +// System.out.println(sdf.format(dt1)); +// System.out.println(sdf.format(end)); +// System.out.println("总共"+monthsDiff+"月"); + String re = reyear+","+remonth+","+tian; + return re; + } + + + + /** + * 计算两个日期之间总共相差多少月(多余的天数算作新的一个月) + * @param startDate + * @param endDate + * @return + * @throws ParseException + */ + public static int getTotalMonthGap(String startDate,String endDate) throws ParseException { +// 设置第一个日期 + String str1 = startDate; +// 获取第二个日期 + String str2 = endDate; +// 设置日期格式 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); +// 将字符串转换成日期 + Date start = sdf.parse(str1); + Date end = sdf.parse(str2); + Date d3 = null; + if(start.getTime()-end.getTime()>0){ + d3 = start; + start = end; + end = d3; + } + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(start); + c2.setTime(end); +// 由于输入的时候结束日期少一天通过代码计算则需要加上此天 + c2.add(Calendar.DATE, 1); + int year1 = c1.get(Calendar.YEAR); + int year2 = c2.get(Calendar.YEAR); + int month1 = c1.get(Calendar.MONTH); + int month2 = c2.get(Calendar.MONTH); + int day1 = c1.get(Calendar.DAY_OF_MONTH); + int day2 = c2.get(Calendar.DAY_OF_MONTH); + int yearInterval = year1 - year2; + if (month1 < month2 || month1 == month2 && day1 < day2) + yearInterval--; + int monthInterval = (month1 + 12) - month2; + if (day1 < day2) + monthInterval--; + monthInterval %= 12; + int monthsDiff = Math.abs(yearInterval * 12 + monthInterval); + int nian = monthsDiff/12; + int yue = monthsDiff - (nian*12); + c1.add(Calendar.YEAR, nian); + if(day1==day2){ +// System.out.println(nian+"年"); +// System.out.println(yue+"月"); + c1.add(Calendar.MONTH, yue); + }else { + c1.add(Calendar.MONTH, yue-1); + if(yue-1<0) { + nian--; + yue=11; + }else { + yue =yue-1; + } +// System.out.println(nian+"年"); +// System.out.println(yue+"月"); +// c1.add(Calendar.MONTH, yue); + } + Date dt1 = c1.getTime(); + long l = dt1.getTime() - end.getTime(); + long tian = l/-(24*60*60*1000); +// System.out.println(tian+"天"); +// System.out.println(sdf.format(dt1)); +// System.out.println(sdf.format(end)); +// System.out.println("总共"+monthsDiff+"月"); + return monthsDiff; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/EnumUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/EnumUtils.java new file mode 100644 index 0000000..54d73e1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/EnumUtils.java @@ -0,0 +1,177 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; + +/** + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class EnumUtils { + + private static final Log LOGGER = CtpLogFactory.getLog(EnumUtils.class); + + /** 枚举-枚举项 映射Map */ + private static Map> enumMap = new HashMap>(); + + /** 单位所有枚举 */ + private static List ctpEnumList; + + /** 枚举管理 */ + private static EnumManager enumManager = (EnumManager)AppContext.getBean("enumManagerNew"); + + /** + * 根据枚举ID 获取枚举key + * @param enumItemId 枚举ID + * @return 枚举显示值 + */ + public static String getEnumItemKey(Long enumItemId) throws BusinessException { + CtpEnumItem item = enumManager.getEnumItem(enumItemId); + if(null != item) { + return item.getValue(); + } + LOGGER.info("没有获取到枚举:" + enumItemId); + return ""; + } + + /** + * 根据枚举ID 获取枚举显示值 + * @param enumItemId 枚举ID + * @return 枚举显示值 + */ + public static String getEnumItemName(String enumItemId) { + if(null == enumItemId || "".equals(enumItemId)) { + return ""; + } + String enumItemName = ""; + try { + enumItemName = enumManager.getEItemNameById(Long.valueOf(enumItemId)); + } catch(BusinessException e) { + LOGGER.error("获取枚举错误:", e); + } + return enumItemName; + } + + /** + * 根据枚举类型名及枚举显示值 获取枚举项的ID + * @param enumTypeName 枚举类型名 + * @param enumItemName 枚举值 + * @return 枚举ID + * @throws Exception 异常 + */ + public static Long getEnumItemId(String enumTypeName, String enumItemName) { + try { + // 查询单位所有枚举 + ctpEnumList = enumManager.getAllOrgCtpEnum(); + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + if(!enumMap.containsKey(enumBean.getId())) { + enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId())); + } + for(CtpEnumItem item : enumMap.get(enumBean.getId())) { + if(enumItemName.equals(item.getShowvalue())) { + return item.getId(); + } + } + } + } + String errorInfo = "枚举类型:" + enumTypeName + "下面没有枚举值为[" + enumItemName + "] 的选项"; + throw new Exception(errorInfo); + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + } + // 先解决一个BUG,返回空的话查询出错 + return 0L; + } + + public static String getEnumItemkey(String enumTypeName, String enumItemName) { + try { + // 查询单位所有枚举 + ctpEnumList = enumManager.getAllOrgCtpEnum(); + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + if(!enumMap.containsKey(enumBean.getId())) { + enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId())); + } + for(CtpEnumItem item : enumMap.get(enumBean.getId())) { + if(enumItemName.equals(item.getShowvalue())) { + return item.getValue(); + } + } + } + } + String errorInfo = "枚举类型:" + enumTypeName + "下面没有枚举值为[" + enumItemName + "] 的选项"; + throw new Exception(errorInfo); + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + } + // 先解决一个BUG,返回空的话查询出错 + return ""; + } + + /** + * 根据枚举类型名获取枚举 + * @param enumTypeName 枚举类型名 + * @return 枚举ID + * @throws Exception 异常 + */ + public static List getEnumItemId(String enumTypeName) { + try { + // 查询单位所有枚举 + ctpEnumList = enumManager.getAllOrgCtpEnum(); + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + return enumManager.getEmumItemByEmumId(enumBean.getId()); + } + } + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + } + // 先解决一个BUG,返回空的话查询出错 + return null; + } + + + /** + * 根据枚举类型名及枚举值 获取枚举项的ID + * @param enumTypeName 枚举类型名 + * @param enumItemName 枚举值 + * @return 枚举ID + * @throws Exception 异常 + */ + public static String getEnumItemIdByKey(String enumTypeName, String enumItemKey) { + try { + // 查询单位所有枚举 + // if(ctpEnumList == null) { + ctpEnumList = enumManager.getAllOrgCtpEnum(); + // } + for(CtpEnumBean enumBean : ctpEnumList) { + if(enumTypeName.equals(enumBean.getLabel())) { + if(!enumMap.containsKey(enumBean.getId())) { + enumMap.put(enumBean.getId(), enumManager.getEmumItemByEmumId(enumBean.getId())); + } + for(CtpEnumItem item : enumMap.get(enumBean.getId())) { + if(enumItemKey.equals(item.getValue())) { + return String.valueOf(item.getId()); + } + } + } + } + String errorInfo = "枚举类型:" + enumTypeName + "下面没有枚举值为[" + enumItemKey + "] 的选项"; + throw new Exception(errorInfo); + } catch(Exception e) { + LOGGER.error("获取枚举错误:", e); + + } + return null; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/FormExportUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/FormExportUtil.java new file mode 100644 index 0000000..15b60f3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/FormExportUtil.java @@ -0,0 +1,62 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.seeyon.v3x.services.form.bean.RecordExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +//创建无流程表单数据处理工具类 +public class FormExportUtil { + + /** + * 设置主表信息 + * @param map 设置主表字段。Map<主表显示名称,主表数据> + * @return + */ + public List setFormValue(Map map){ +// 创建返回值对象 + List valueExports = new ArrayList(); + ValueExport valueExport ; +// 获取参数信息(显示名称) + Set keys = map.keySet(); + if(keys.size()>0) { +// 对控件赋值 + for (String key : keys) { + valueExport = new ValueExport(); + valueExport.setDisplayName(key); + valueExport.setValue(map.get(key).toString()); + valueExports.add(valueExport); + } + } + return valueExports; + } + + /** + * 设置从表信息 + * @param map 设置主表字段。List> + */ + public List setSubordinateFormValue(List> lists){ + List subordinateFormExports = new ArrayList(); + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List recordExports = new ArrayList(); + List valueExports; + RecordExport recordExport; + for(int i = 0 ; i < lists.size() ; i++) { + recordExport = new RecordExport(); + valueExports = setFormValue(lists.get(i)); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + + return subordinateFormExports; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/HeaderUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/HeaderUtil.java new file mode 100644 index 0000000..75ea66e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/HeaderUtil.java @@ -0,0 +1,42 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.io.UnsupportedEncodingException; +import java.util.Base64; +import java.util.Date; + +import org.apache.commons.codec.digest.DigestUtils; + +import com.alibaba.fastjson.JSONObject; + +public class HeaderUtil { + + public static JSONObject getHeader() throws UnsupportedEncodingException{ + JSONObject headerer = new JSONObject(); + headerer.put("Content-Type", "application/json;charset=utf-8"); + Date date = new Date(); + String ts = date.getTime()+""; + headerer.put("ts", ts); + headerer.put("client_id", "OA"); + headerer.put("client_security", "30dcf9a3cfef4b98a157e926db6369f0"); + String p=ts+"30dcf9a3cfef4b98a157e926db6369f0"; + byte[] bytes = DigestUtils.md5(p.getBytes("UTF-8")); // md5 + String signature= Base64.getEncoder().encodeToString(bytes); //base64 + headerer.put("signature", signature); + return headerer; + } + + public static void main(String[] args) throws UnsupportedEncodingException { + JSONObject headerer = new JSONObject(); + headerer.put("Content-Type", "application/json;charset=utf-8"); + Date date = new Date(); + String ts = date.getTime()+""; + headerer.put("ts", ts); + headerer.put("client_id", "OA"); + headerer.put("client_security", "30dcf9a3cfef4b98a157e926db6369f0"); + String p=ts+"30dcf9a3cfef4b98a157e926db6369f0"; + byte[] bytes = DigestUtils.md5(p.getBytes("UTF-8")); // md5 + String signature= Base64.getEncoder().encodeToString(bytes); //base64 + headerer.put("signature", signature); + System.out.println(headerer); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/JdbcUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/JdbcUtil.java new file mode 100644 index 0000000..b23ca9c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/JdbcUtil.java @@ -0,0 +1,82 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import com.seeyon.apps.src_contract.lease.kit.PropJDBCKit; + + +/** + * jdbc工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ + public class JdbcUtil { + private static String url; + private static String user; + private static String password; + + static { + // 使用properties加载属性文件 +// Properties prop = new Properties(); + try { +// InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("pa.properties"); +// prop.load(is); + // 注册驱动(获取属性文件中的数据) + String driverClassName = PropJDBCKit.getProp(PropJDBCKit.JDBCDRIVER); + Class.forName(driverClassName); + // 获取属性文件中的url,username,password + url = PropJDBCKit.getProp(PropJDBCKit.JDBCURL); + user = PropJDBCKit.getProp(PropJDBCKit.JDBCUSER); + password = PropJDBCKit.getProp(PropJDBCKit.JDBCPASSWORD); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取数据库连接 + public static Connection getConnection() { + Connection conn = null; + try { + conn = DriverManager.getConnection(url, user, password); + } catch (SQLException e) { + e.printStackTrace(); + } + return conn; + } + + // 释放资源 + public static void close(Connection conn, Statement stat, ResultSet rs) { + close(conn, stat); + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + // 释放资源 + public static void close(Connection conn, Statement stat) { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (stat != null) { + try { + stat.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/ProtUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/ProtUtil.java new file mode 100644 index 0000000..190f5a1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/ProtUtil.java @@ -0,0 +1,134 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpResponse; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import com.alibaba.fastjson.JSONObject; + +public class ProtUtil { + private static final Log log = LogFactory.getLog(ProtUtil.class); + + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public static JSONObject doPost(JSONObject param, String urlStr,JSONObject headerer) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + System.out.println(urlStr); + URL url = new URL(urlStr); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", headerer.getString("Content-Type")); + connection.setRequestProperty("ts", headerer.getString("ts")); + connection.setRequestProperty("client_id", headerer.getString("client_id")); + connection.setRequestProperty("client_security", headerer.getString("client_security")); + connection.setRequestProperty("signature", headerer.getString("signature")); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + String str = param.toString(); + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + System.out.println(connection.getResponseCode()); + // 连接对象获取一个输入流,向远程读取 + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + System.out.println(result); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + System.out.println(e); + } catch (IOException e) { + e.printStackTrace(); + System.out.println(e); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + System.out.println(json); + return json; + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/RentCalculationUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/RentCalculationUtil.java new file mode 100644 index 0000000..1ec32ab --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/lease/util/RentCalculationUtil.java @@ -0,0 +1,385 @@ +package com.seeyon.apps.src_contract.lease.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.Period; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +public class RentCalculationUtil { + /** + * 缴费方式年 + * @return + * @throws ParseException + */ +// 开始时间,结束时间,缴费期限,租金,月份,平米单价 + public List> paymentMethodYear(Map map) throws ParseException { + List> list = new ArrayList>(); +// 两个日期相差多少月 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = map.get("startDate").toString(); + String endDate = map.get("endDate").toString(); + String dateString = DateGapUtil.getYearMonthDayGap(startDate,endDate); + String[] dateStr = dateString.split(","); + int year = Integer.parseInt(dateStr[0]); + Date start = sdf.parse(startDate); + Calendar startTime = Calendar.getInstance(); + startTime.setTime(start); + String deadline = ""; + if(map.get("deadline")==null){ + deadline="0"; + }else { + deadline = map.get("deadline").toString(); + } + String rent = map.get("rent").toString(); + String acreage = map.get("acreage").toString(); + for(int i = 0 ; i < year ; i ++) { + Map submap = new HashMap(); +// 获取合同开始结束时间 + submap.put("开始时间", sdf.format(startTime.getTime())); +// 计算缴费时限(缴费开始日期-支付期限) + Date deadlineDate= new Date(startTime.getTime().getTime()-(Long.parseLong(deadline)*24*60*60*1000)); + submap.put("当期缴费时限", sdf.format(deadlineDate)); + startTime.add(Calendar.YEAR, 1); + startTime.add(Calendar.DATE, -1); + int months = 0; + if(i!=year-1) { + submap.put("结束时间", sdf.format(startTime.getTime())); +// 获取租金 + months = DateGapUtil.getTotalMonthGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + submap.put("当期月数", months); + submap.put("租金", rent); +// double unitPrice = Double.parseDouble(rent)/months/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + }else { + submap.put("结束时间", endDate); +// 计算租金 + String ymd = DateGapUtil.getYearMonthDayGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + String[] ymds = ymd.split(","); + double mon = Integer.parseInt(ymds[0])*12+Integer.parseInt(ymds[1])+(Double.parseDouble(ymds[2])/30); + submap.put("当期月数", mon); + double rentdou = Double.parseDouble(rent); + submap.put("租金", rentdou); + //double unitPrice =rentdou/12/Double.parseDouble(acreage); + //submap.put("核单价", unitPrice); + } + startTime.add(Calendar.DATE, 1); +// 计算核单价 + list.add(submap); + } + return list; + } + + /** + * 缴费方式月 + * @return + * @throws ParseException + */ + public List> paymentMethodMonth(Map map) throws ParseException { + List> list = new ArrayList>(); +// 两个日期相差多少月 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = map.get("startDate").toString(); + String endDate = map.get("endDate").toString(); + String dateString = DateGapUtil.getYearMonthDayGap(startDate,endDate); + String[] dateStrings = dateString.split(","); + int cyclesNum = Integer.parseInt(dateStrings[0])*12+Integer.parseInt(dateStrings[1]); + Date start = sdf.parse(startDate); + Calendar startTime = Calendar.getInstance(); + startTime.setTime(start); + String deadline = ""; + if(map.get("deadline")==null){ + deadline="0"; + }else { + deadline = map.get("deadline").toString(); + } + String rent = map.get("rent").toString(); + String acreage = map.get("acreage").toString(); + for(int i = 0 ; i < cyclesNum ; i ++) { + Map submap = new HashMap(); +// 获取合同开始结束时间 + submap.put("开始时间", sdf.format(startTime.getTime())); +// 计算缴费时限(缴费开始日期-支付期限) + Date deadlineDate= new Date(startTime.getTime().getTime()-(Long.parseLong(deadline)*24*60*60*1000)); + submap.put("当期缴费时限", sdf.format(deadlineDate)); + startTime.add(Calendar.MONTH, 1); + startTime.add(Calendar.DATE, -1); + int months = 0; + if(i!= cyclesNum-1) { + submap.put("结束时间", sdf.format(startTime.getTime())); +// 获取租金 + months = DateGapUtil.getTotalMonthGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + submap.put("当期月数", months); + submap.put("租金", rent); +// double unitPrice = Double.parseDouble(rent)/months/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + }else { + submap.put("结束时间", endDate); +// 计算租金 + String ymd = DateGapUtil.getYearMonthDayGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + String[] ymds = ymd.split(","); + double mon = Integer.parseInt(ymds[1])+(Double.parseDouble(ymds[2])/30); + submap.put("当期月数", mon); + double rentdou = Double.parseDouble(rent); + submap.put("租金", rentdou); +// double unitPrice =rentdou/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + } + startTime.add(Calendar.DATE, 1); +// 计算核单价 + list.add(submap); + } + return list; + } + + /** + * 缴费方式季 + * @return + * @throws ParseException + */ + public List> paymentMethodQuarter(Map map) throws ParseException { + List> list = new ArrayList>(); +// 两个日期相差多少月 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = map.get("startDate").toString(); + String endDate = map.get("endDate").toString(); + int dateString = DateGapUtil.getTotalMonthGap(startDate,endDate); + int cyclesNum = dateString/3; + Date start = sdf.parse(startDate); + Calendar startTime = Calendar.getInstance(); + startTime.setTime(start); + String deadline = ""; + if(map.get("deadline")==null){ + deadline="0"; + }else { + deadline = map.get("deadline").toString(); + } + String rent = map.get("rent").toString(); + String acreage = map.get("acreage").toString(); + for(int i = 0 ; i < cyclesNum ; i ++) { + Map submap = new HashMap(); +// 获取合同开始结束时间 + submap.put("开始时间", sdf.format(startTime.getTime())); +// 计算缴费时限(缴费开始日期-支付期限) + Date deadlineDate= new Date(startTime.getTime().getTime()-(Long.parseLong(deadline)*24*60*60*1000)); + submap.put("当期缴费时限", sdf.format(deadlineDate)); + startTime.add(Calendar.MONTH, 3); + startTime.add(Calendar.DATE, -1); + int months = 0; + if(i!=cyclesNum-1) { + submap.put("结束时间", sdf.format(startTime.getTime())); +// 获取租金 + months = DateGapUtil.getTotalMonthGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + submap.put("当期月数", months); + submap.put("租金", rent); +// double unitPrice = Double.parseDouble(rent)/months/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + }else { + submap.put("结束时间", endDate); +// 计算租金 + String ymd = DateGapUtil.getYearMonthDayGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + String[] ymds = ymd.split(","); + double mon = Integer.parseInt(ymds[1])+(Double.parseDouble(ymds[2])/30); + submap.put("当期月数", mon); + double rentdou = Double.parseDouble(rent); + submap.put("租金", rentdou); +// double unitPrice =rentdou/3/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + } + startTime.add(Calendar.DATE, 1); +// 计算核单价 + list.add(submap); + } + return list; + } + + /** + * 缴费方式半年 + * @return + * @throws ParseException + */ + public List> paymentMethodSemiannua(Map map) throws ParseException { + List> list = new ArrayList>(); +// 两个日期相差多少月 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startDate = map.get("startDate").toString(); + String endDate = map.get("endDate").toString(); + int dateString = DateGapUtil.getTotalMonthGap(startDate,endDate); + int cyclesNum = dateString/6; + Date start = sdf.parse(startDate); + Calendar startTime = Calendar.getInstance(); + startTime.setTime(start); + String deadline = ""; + if(map.get("deadline")==null){ + deadline="0"; + }else { + deadline = map.get("deadline").toString(); + } + String rent = map.get("rent").toString(); + String acreage = map.get("acreage").toString(); + for(int i = 0 ; i < cyclesNum ; i ++) { + Map submap = new HashMap(); +// 获取合同开始结束时间 + submap.put("开始时间", sdf.format(startTime.getTime())); +// 计算缴费时限(缴费开始日期-支付期限) + Date deadlineDate= new Date(startTime.getTime().getTime()-(Long.parseLong(deadline)*24*60*60*1000)); + submap.put("当期缴费时限", sdf.format(deadlineDate)); + startTime.add(Calendar.MONTH, 6); + startTime.add(Calendar.DATE, -1); + int months = 0; + if(i!=cyclesNum-1) { + submap.put("结束时间", sdf.format(startTime.getTime())); +// 获取租金 + months = DateGapUtil.getTotalMonthGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + submap.put("当期月数", months); + submap.put("租金", rent); +// double unitPrice = Double.parseDouble(rent)/months/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + }else { + submap.put("结束时间", endDate); +// 计算租金 + String ymd = DateGapUtil.getYearMonthDayGap(submap.get("开始时间").toString(),submap.get("结束时间").toString()); + String[] ymds = ymd.split(","); + double mon = Integer.parseInt(ymds[0])*12+Integer.parseInt(ymds[1])+(Double.parseDouble(ymds[2])/30); + submap.put("当期月数", mon); + double rentdou = Double.parseDouble(rent); + submap.put("租金", rentdou); +// double unitPrice =rentdou/6/Double.parseDouble(acreage); +// submap.put("核单价", unitPrice); + } + startTime.add(Calendar.DATE, 1); +// 计算核单价 + list.add(submap); + } + return list; + } + + /** + * 缴费方式一次性 + * @return + * @throws ParseException + */ + public List> paymentMethodAll(Map map) throws ParseException { + List> list = new ArrayList>(); + Map submap = new HashMap(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); +// 获取合同开始结束时间 + String startDate = map.get("startDate").toString(); + String endDate = map.get("endDate").toString(); + submap.put("开始时间", startDate); + submap.put("结束时间", endDate); +// 计算缴费时限(缴费开始日期-支付期限) + String deadline = ""; + if(map.get("deadline")==null){ + deadline="0"; + }else { + deadline = map.get("deadline").toString(); + } + Date deadlineDate= new Date(sdf.parse(startDate).getTime()-(Long.parseLong(deadline)*24*60*60*1000)); + submap.put("当期缴费时限", sdf.format(deadlineDate)); +// 获取租金 + String rent = map.get("rent").toString(); + submap.put("租金", rent); + int months = DateGapUtil.getTotalMonthGap(startDate, endDate); + submap.put("当期月数", months); +// 计算核单价 + String acreage = map.get("acreage").toString(); + double unitPrice = Double.parseDouble(rent)/months/Double.parseDouble(acreage); + submap.put("核单价", unitPrice); + list.add(submap); + return list; + } + + + + public List> handleCollectionSub(JSONArray jsonArray) { + List> list = new ArrayList>(); + JSONObject jsonObjetc = jsonArray.getJSONObject(0); + JSONArray plans = jsonObjetc.getJSONArray("plans"); + System.out.println("plans:"+plans); + for(int i = 0 ; i < plans.size() ; i++) { + System.out.println(i); + JSONObject plan = plans.getJSONObject(i); + Map submap = new HashMap(); + submap.put("开始时间", plan.get("planStartDate")); + submap.put("结束时间", plan.get("planEndDate")); + submap.put("当期缴费时限", plan.get("currentPaymentTime")); + submap.put("租费合计", plan.get("planAmount")); + submap.put("当期月数", plan.get("planBetweenDate")); + submap.put("租金", plan.get("rent")); + submap.put("管理服务费", plan.get("manageServiceFee")); + submap.put("市场管理费", plan.get("marketFee")); + list.add(submap); + } + return list; + } + + + public List> updateCollectionSub(List> historyPayments,JSONArray jsonArray) { + List> list = new ArrayList>(); + for (Map historyPayment : historyPayments) { + Map submap = new HashMap(); + submap.put("开始时间", historyPayment.get("STARTDATE")); + submap.put("结束时间", historyPayment.get("ENDDATE")); + submap.put("当期缴费时限", historyPayment.get("PLANENDDATE")); + submap.put("租费合计", historyPayment.get("PLANTOTALCOST")); + String startDate = historyPayment.get("STARTDATE").toString(); + String endDate = historyPayment.get("ENDDATE").toString(); + LocalDate date1 = LocalDate.of(Integer.parseInt(startDate.substring(0,4)), + Integer.parseInt(startDate.substring(5,7)), + Integer.parseInt(startDate.substring(8,10))); + LocalDate date2 = LocalDate.of(Integer.parseInt(endDate.substring(0,4)), + Integer.parseInt(endDate.substring(5,7)), + Integer.parseInt(endDate.substring(8,10))); + LocalDate nextDay = date2.plusDays(1); + Period period = Period.between(date1, nextDay); + int months = period.getMonths(); + submap.put("当期月数", months); + submap.put("租金", historyPayment.get("DETAILRENT")); + submap.put("管理服务费", historyPayment.get("DETAILMANAGESERVICEFEE")); + submap.put("市场管理费", historyPayment.get("DETAILMARKETFEE")); + + submap.put("减免租金", historyPayment.get("DERATERENT")); + submap.put("减免管理服务费", historyPayment.get("DERATEMANAGESERVICEFEE")); + submap.put("减免市场管理费", historyPayment.get("DERATEMARKETFEE")); + + submap.put("递增租金", historyPayment.get("INCREASERENT")); + submap.put("递增管理服务费", historyPayment.get("INCREASEMANAGESERVICEFEE")); + submap.put("递增市场管理费", historyPayment.get("INCREASEMARKETFEE")); + + submap.put("已收金额", historyPayment.get("RECEIVETOTALCOST")); + submap.put("剩余未收金额", historyPayment.get("REMAINTOTALCOST")); + submap.put("是否历史账期", "1"); + list.add(submap); + } + JSONObject jsonObjetc = jsonArray.getJSONObject(0); + JSONArray plans = jsonObjetc.getJSONArray("plans"); + System.out.println("plans:"+plans); + for(int i = 0 ; i < plans.size() ; i++) { + System.out.println(i); + JSONObject plan = plans.getJSONObject(i); + Map submap = new HashMap(); + submap.put("开始时间", plan.get("planStartDate")); + submap.put("结束时间", plan.get("planEndDate")); + submap.put("当期缴费时限", plan.get("currentPaymentTime")); + submap.put("租费合计", plan.get("planAmount")); + submap.put("当期月数", plan.get("planBetweenDate")); + submap.put("租金", plan.get("rent")); + submap.put("管理服务费", plan.get("manageServiceFee")); + submap.put("市场管理费", plan.get("marketFee")); + submap.put("已收金额", "0"); + submap.put("是否历史账期", "0"); + list.add(submap); + } + return list; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/node/OrdinaryContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/node/OrdinaryContractNode.java new file mode 100644 index 0000000..21c0a1e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/node/OrdinaryContractNode.java @@ -0,0 +1,131 @@ +package com.seeyon.apps.src_contract.ordinary.node; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.apps.src_contract.ordinary.param.OrdinaryContractParam; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; + +public class OrdinaryContractNode extends ACommonSuperNode { + + private static final Log log = Log.get(OrdinaryContractNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "ordinaryContractNode"; + } + + @Override + public String getNodeName() { + return "OA一般合同同步BIP合同超级节点"; + } + + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + +private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + String summaryId = formDataVo.getColSummary().getId()+""; + try { + OrdinaryContractParam ordinaryContractParam = new OrdinaryContractParam(); + JSONObject jsonObject = new JSONObject(); + JSONObject res = new JSONObject(); + String typeId = formDataVo.getFieldData("收付款合同属性")!=null?formDataVo.getFieldData("收付款合同属性").getDbValue()+"":""; +// String typeId = CAP4FormKit.getFieldStrValue(master, "收付款合同属性"); + String typeValue = getEnumManagerNew().getEnumItem(Long.parseLong(typeId)).getValue(); + JSONObject headerer = HeaderUtil.getHeader(); + String url = ""; + if("1".equals(typeValue)) { + jsonObject = ordinaryContractParam.getOrdinaryPaymentContractParam(formDataVo,summaryId); + log.info("付款"); + url = PropKit.getProp(PropKit.PAYMENTCONTRACTURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + }else if("2".equals(typeValue)) { + jsonObject = ordinaryContractParam.getOrdinaryCollectionContractParam(formDataVo,summaryId); + url = PropKit.getProp(PropKit.RECEIVECONTRACTURL); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + log.info("收款"); + res = ProtUtil.doPost(jsonObject, PropKit.getProp(PropKit.RECEIVECONTRACTURL), headerer); + context.setResponse(res.toString()); + }else{ + log.info("不涉及收付款业务,跳过推送BIP处理"); + context.success("不涉及收付款业务,跳过推送BIP处理"); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "不涉及收付款业务,跳过推送BIP处理"); + } + if(res.isEmpty()) { + log.info("一般合同创建失败,请联系管理员处理"); + context.back("一般合同创建失败,请联系管理员处理"); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "一般合同创建失败,请联系管理员处理"); + }else { + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + log.info("推送BIP一般合同成功"); + log.info(msg); + context.success(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", msg); + }else { + log.info("推送BIP一般合同失败:"+res.get("msg").toString()); + context.back("推送BIP一般合同失败:"+res.get("msg").toString()); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP一般合同失败:"+res.get("msg").toString()); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.info( "推送BIP一般合同失败:"+e); + context.back( "推送BIP一般合同失败:"+e); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP一般合同失败:"+e); + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/node/OrdinaryStopContractNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/node/OrdinaryStopContractNode.java new file mode 100644 index 0000000..6a71b09 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/node/OrdinaryStopContractNode.java @@ -0,0 +1,120 @@ +package com.seeyon.apps.src_contract.ordinary.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_contract.lease.constants.ContractConstants; +import com.seeyon.apps.src_contract.lease.kit.PropKit; +import com.seeyon.apps.src_contract.lease.util.HeaderUtil; +import com.seeyon.apps.src_contract.lease.util.ProtUtil; +import com.seeyon.apps.src_contract.ordinary.param.OrdinaryContractParam; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; + +public class OrdinaryStopContractNode extends ACommonSuperNode { + + private static final Log log = Log.get(OrdinaryStopContractNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "ordinaryStopContractNode"; + } + + @Override + public String getNodeName() { + return "OA一般合同终止BIP合同超级节点"; + } + + @Override + public String getPluginId() { + return ContractConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getContractConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getContractConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + try { + OrdinaryContractParam ordinaryContractParam = new OrdinaryContractParam(); + JSONObject headerer = HeaderUtil.getHeader(); +// String ordinaryid = CAP4FormKit.getFieldStrValue(master, "合同类型"); + String ordinaryid = formDataVo.getFieldData("合同类型")!=null?formDataVo.getFieldData("合同类型").getDbValue()+"":""; + String ordinary = getEnumManagerNew().getEnumItem(Long.parseLong(ordinaryid)).getValue(); + JSONObject res = new JSONObject(); + if("0".equals(ordinary)) { + String url = PropKit.getProp(PropKit.TERMINATIONCONTRACTURL); + context.setUrl(url); + JSONObject jsonObject = ordinaryContractParam.getOrdinaryContractSKStopParam(formDataVo); + context.setRequest(jsonObject.toString()); + res = ProtUtil.doPost(jsonObject,url, headerer); + context.setResponse(res.toString()); + }else if ("1".equals(ordinary)) { + String url = PropKit.getProp(PropKit.TERMINATIONFKCONTRACTURL); + JSONObject jsonObject = ordinaryContractParam.getOrdinaryContractFKStopParam(formDataVo); + context.setUrl(url); + context.setRequest(jsonObject.toString()); + res = ProtUtil.doPost(jsonObject,url , headerer); + context.setResponse(res.toString()); + } + if(res.isEmpty()) { + log.error("一般合同终止失败,请联系管理员处理"); + context.back("一般合同终止失败,请联系管理员处理"); + context.setErrMsg("一般合同终止失败,请联系管理员处理"); + }else { + String isStatus = res.get("status").toString(); + String msg = res.get("msg").toString(); + if("1".equals(isStatus)) { + log.info("推送BIP一般合同终止成功"); + context.success(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果",msg); + }else { + log.info("推送BIP一般合同终止失败:"+res.get("msg").toString()); + context.back(msg); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP一般合同终止失败:"+res.get("msg").toString()); + } + } + } catch (Exception e) { + log.error("异常:"+ e); + context.back("异常:"+ e); + e.printStackTrace(); + formDataVo.getNewFieldDataMap().put("BIP返回结果", "推送BIP一般合同终止失败:"+e); + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/param/OrdinaryContractParam.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/param/OrdinaryContractParam.java new file mode 100644 index 0000000..c6faf25 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_contract/ordinary/param/OrdinaryContractParam.java @@ -0,0 +1,275 @@ +package com.seeyon.apps.src_contract.ordinary.param; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import org.apache.commons.io.FileUtils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_contract.lease.kit.form.CAP4FormKit; +import com.seeyon.apps.src_contract.lease.util.EnumUtils; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.v3x.dee.util.DateUtil; + +public class OrdinaryContractParam { + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + /** + * 一般付款合同参数封装 + * @param formDataVo + * @param summaryId + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getOrdinaryPaymentContractParam(FormDataVo formDataVo, String summaryId) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("financialOrg", CAP4FormKit.getFieldStrValue(master, "NC公司编码"));//财务组织编码 + jsonObject.put("financialOrg", formDataVo.getFieldData("NC公司编码")!=null?formDataVo.getFieldData("NC公司编码").getStringValue():"");//财务组织编码 + jsonObject.put("oaUrl", "/seeyon/cst/flowInfo.do?summaryId="+summaryId);//OA联查链接 +// jsonObject.put("OAbillCode", CAP4FormKit.getFieldStrValue(master, "单据编号"));//OA单据编号 + jsonObject.put("OAbillCode", formDataVo.getFieldData("单据编号")!=null?formDataVo.getFieldData("单据编号").getStringValue():"");//OA单据编号 +// jsonObject.put("VbillCode", CAP4FormKit.getFieldStrValue(master, "合同编号"));//合同编码 + jsonObject.put("VbillCode", formDataVo.getFieldData("合同编号")!=null?formDataVo.getFieldData("合同编号").getStringValue():"");//合同编码 +// jsonObject.put("contractName", CAP4FormKit.getFieldStrValue(master, "合同名称"));//合同名称 + jsonObject.put("contractName", formDataVo.getFieldData("合同名称")!=null?formDataVo.getFieldData("合同名称").getStringValue():"");//合同名称 +// jsonObject.put("supplier", CAP4FormKit.getFieldStrValue(master, "默认客商编码"));//客户编码 + jsonObject.put("supplier", formDataVo.getFieldData("默认客商编码")!=null?formDataVo.getFieldData("默认客商编码").getStringValue():"");//客户编码 +// jsonObject.put("personnelid", CAP4FormKit.getFieldStrValue(master, "经办人手机号码"));//承办人员(传电话号码过来) + jsonObject.put("personnelid", formDataVo.getFieldData("经办人手机号码")!=null?formDataVo.getFieldData("经办人手机号码").getStringValue():"");//承办人员(传电话号码过来) +// jsonObject.put("contractApproveDate", CAP4FormKit.getFieldStrValue(master, "合同签订日期"));//签字盖章日期 + jsonObject.put("contractApproveDate", formDataVo.getFieldData("合同签订日期")!=null?formDataVo.getFieldData("合同签订日期").getStringValue():"");//签字盖章日期 +// jsonObject.put("ntotalOrigMny", CAP4FormKit.getFieldStrValue(master, "合同金额"));//原币价税合计 + jsonObject.put("ntotalOrigMny", formDataVo.getFieldData("合同金额")!=null?formDataVo.getFieldData("合同金额").getStringValue():"");//原币价税合计 +// jsonObject.put("contractStartDate", CAP4FormKit.getFieldStrValue(master, "合同开始日期"));//计划生效日期 + jsonObject.put("contractStartDate", formDataVo.getFieldData("合同开始日期")!=null?formDataVo.getFieldData("合同开始日期").getStringValue():"");//计划生效日期 +// jsonObject.put("contractEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期"));//计划终止日期 + jsonObject.put("contractEndDate", formDataVo.getFieldData("合同结束日期")!=null?formDataVo.getFieldData("合同结束日期").getStringValue():"");//计划终止日期 +// jsonObject.put("vdef33", CAP4FormKit.getFieldStrValue(master, "说明事项"));//说明事项 + jsonObject.put("vdef33", formDataVo.getFieldData("说明事项")!=null?formDataVo.getFieldData("说明事项").getStringValue():"");//说明事项 +// jsonObject.put("vdef34", CAP4FormKit.getFieldStrValue(master, "联系人"));//对方联系人姓名 + jsonObject.put("vdef34", formDataVo.getFieldData("联系人")!=null?formDataVo.getFieldData("联系人").getStringValue():"");//对方联系人姓名 +// jsonObject.put("vdef36", CAP4FormKit.getFieldStrValue(master, "预留字段1"));//预留字段1 + jsonObject.put("vdef36", formDataVo.getFieldData("预留字段1")!=null?formDataVo.getFieldData("预留字段1").getStringValue():"");//预留字段1 +// jsonObject.put("vdef37", CAP4FormKit.getFieldStrValue(master, "预留字段2"));//预留字段2 + jsonObject.put("vdef37", formDataVo.getFieldData("预留字段2")!=null?formDataVo.getFieldData("预留字段2").getStringValue():"");//预留字段2 +// jsonObject.put("vdef38", CAP4FormKit.getFieldStrValue(master, "预留字段3"));//预留字段3 + jsonObject.put("vdef38", formDataVo.getFieldData("预留字段3")!=null?formDataVo.getFieldData("预留字段3").getStringValue():"");//预留字段3 +// jsonObject.put("vdef39", CAP4FormKit.getFieldStrValue(master, "预留字段4"));//预留字段4 + jsonObject.put("vdef39", formDataVo.getFieldData("预留字段4")!=null?formDataVo.getFieldData("预留字段4").getStringValue():"");//预留字段4 +// jsonObject.put("vdef40", CAP4FormKit.getFieldStrValue(master, "预留字段5"));//预留字段5 + jsonObject.put("vdef40", formDataVo.getFieldData("预留字段5")!=null?formDataVo.getFieldData("预留字段5").getStringValue():"");//预留字段5 +// jsonObject.put("rate", CAP4FormKit.getFieldStrValue(master, "中标费率"));//费率 + jsonObject.put("rate", formDataVo.getFieldData("中标费率")!=null?formDataVo.getFieldData("中标费率").getStringValue():"");//费率 +// 期初标识 +// String earlySignid = CAP4FormKit.getFieldStrValue(master, "期初标识"); + String earlySignid = formDataVo.getFieldData("中标费率")!=null?formDataVo.getFieldData("中标费率").getDbValue()+"":""; + if("".equals(earlySignid)) { + jsonObject.put("earlySign", "");//期初标识 + }else { + String earlySign = getEnumManagerNew().getEnumItem(Long.parseLong(earlySignid)).getLabel(); + if("是".equals(earlySign)){ + jsonObject.put("earlySign", "Y");//期初标识 + }else { + jsonObject.put("earlySign", "");//期初标识 + } + } +// jsonObject.put("margin", CAP4FormKit.getFieldStrValue(master, "保证金"));//保证金 + jsonObject.put("margin", formDataVo.getFieldData("保证金")!=null?formDataVo.getFieldData("保证金").getStringValue():"");//保证金 +// jsonObject.put("paymentAccumulate", CAP4FormKit.getFieldStrValue(master, "期初已付款金额"));//累计付款 + jsonObject.put("paymentAccumulate", formDataVo.getFieldData("期初已付款金额")!=null?formDataVo.getFieldData("期初已付款金额").getStringValue():"");//累计付款 +// jsonObject.put("invoiceMoney", CAP4FormKit.getFieldStrValue(master, "期初已开票金额"));//开票金额 + jsonObject.put("invoiceMoney", formDataVo.getFieldData("期初已开票金额")!=null?formDataVo.getFieldData("期初已开票金额").getStringValue():"");//开票金额 + + JSONArray body = new JSONArray(); +// List formDataSubBeans = CAP4FormKit.getSubBeans(master,"合同条款信息"); + List subFormDataVos = formDataVo.getSubFormMap().get("合同条款信息"); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject json = new JSONObject(); +// json.put("vtermname", CAP4FormKit.getSubFieldValue(formDataSubBean,"条款名称")); //条款名称 + json.put("vtermname", subFormDataVo.getFieldData("条款名称")!=null?subFormDataVo.getFieldData("条款名称").getStringValue():""); //条款名称 +// json.put("vtermcontent", CAP4FormKit.getSubFieldValue(formDataSubBean,"条款内容")); //条款内容 + json.put("vtermcontent", subFormDataVo.getFieldData("条款内容")!=null?subFormDataVo.getFieldData("条款内容").getStringValue():""); //条款内容 +// json.put("vmemo", CAP4FormKit.getSubFieldValue(formDataSubBean,"备注")); //备注 + json.put("vmemo", subFormDataVo.getFieldData("备注")!=null?subFormDataVo.getFieldData("备注").getStringValue():""); //备注 +// json.put("planStartDate", CAP4FormKit.getFieldStrValue(master, "合同开始日期")); //开始时间 + json.put("planStartDate", formDataVo.getFieldData("合同开始日期")!=null?formDataVo.getFieldData("合同开始日期").getStringValue():""); //开始时间 +// json.put("planEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期")); //结束时间 + json.put("planEndDate", formDataVo.getFieldData("合同结束日期")!=null?formDataVo.getFieldData("合同结束日期").getStringValue():""); //结束时间 + body.add(json); + } + jsonObject.put("body", body);//收款计划的集合 +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/OrdinaryContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPHTSK_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + /** + * 一般收款合同参数封装 + * @param formDataVo + * @param summaryId + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getOrdinaryCollectionContractParam(FormDataVo formDataVo,String summaryId) throws IOException, BusinessException, NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("financeCode", CAP4FormKit.getFieldStrValue(master, "NC公司编码"));//财务组织编码 + jsonObject.put("financeCode", formDataVo.getFieldData("NC公司编码")!=null?formDataVo.getFieldData("NC公司编码").getStringValue():"");//财务组织编码 +// jsonObject.put("VbillCode", CAP4FormKit.getFieldStrValue(master, "合同编号"));//合同编码 + jsonObject.put("VbillCode", formDataVo.getFieldData("合同编号")!=null?formDataVo.getFieldData("合同编号").getStringValue():"");//合同编码 +// jsonObject.put("contractName", CAP4FormKit.getFieldStrValue(master, "合同名称"));//合同名称 + jsonObject.put("contractName", formDataVo.getFieldData("合同名称")!=null?formDataVo.getFieldData("合同名称").getStringValue():"");//合同名称 + jsonObject.put("oaUrl", "/seeyon/cst/flowInfo.do?summaryId="+summaryId);//OA联查链接 +// jsonObject.put("OAbillCode", CAP4FormKit.getFieldStrValue(master, "单据编号"));//OA单据编号 + jsonObject.put("OAbillCode", formDataVo.getFieldData("单据编号")!=null?formDataVo.getFieldData("单据编号").getStringValue():"");//OA单据编号 +// jsonObject.put("contractApproveDate", CAP4FormKit.getFieldStrValue(master, "合同签订日期"));//签字盖章日期 + jsonObject.put("contractApproveDate", formDataVo.getFieldData("合同签订日期")!=null?formDataVo.getFieldData("合同签订日期").getStringValue():"");//签字盖章日期 +// jsonObject.put("contractStartDate", CAP4FormKit.getFieldStrValue(master, "合同开始日期"));//计划生效日期 + jsonObject.put("contractStartDate", formDataVo.getFieldData("合同开始日期")!=null?formDataVo.getFieldData("合同开始日期").getStringValue():"");//计划生效日期 +// jsonObject.put("contractEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期"));//计划终止日期 + jsonObject.put("contractEndDate", formDataVo.getFieldData("合同结束日期")!=null?formDataVo.getFieldData("合同结束日期").getStringValue():"");//计划终止日期 +// jsonObject.put("customerCode", CAP4FormKit.getFieldStrValue(master, "默认客商编码"));//客户编码 + jsonObject.put("customerCode", formDataVo.getFieldData("默认客商编码")!=null?formDataVo.getFieldData("默认客商编码").getStringValue():"");//客户编码 +// jsonObject.put("ntotalOrigMny", CAP4FormKit.getFieldStrValue(master, "合同金额"));//原币价税合计 + jsonObject.put("ntotalOrigMny", formDataVo.getFieldData("合同金额")!=null?formDataVo.getFieldData("合同金额").getStringValue():"");//原币价税合计 +// jsonObject.put("personnelid", CAP4FormKit.getFieldStrValue(master, "经办人手机号码"));//承办人员(传电话号码过来) + jsonObject.put("personnelid", formDataVo.getFieldData("经办人手机号码")!=null?formDataVo.getFieldData("经办人手机号码").getStringValue():"");//承办人员(传电话号码过来) +// jsonObject.put("vdef33", CAP4FormKit.getFieldStrValue(master, "说明事项"));//说明事项 + jsonObject.put("vdef33", formDataVo.getFieldData("说明事项")!=null?formDataVo.getFieldData("说明事项").getStringValue():"");//说明事项 +// jsonObject.put("vdef34", CAP4FormKit.getFieldStrValue(master, "联系人"));//对方联系人姓名 + jsonObject.put("vdef34", formDataVo.getFieldData("联系人")!=null?formDataVo.getFieldData("联系人").getStringValue():"");//对方联系人姓名 +// jsonObject.put("vdef36", CAP4FormKit.getFieldStrValue(master, "预留字段1"));//预留字段1 + jsonObject.put("vdef36", formDataVo.getFieldData("预留字段1")!=null?formDataVo.getFieldData("预留字段1").getStringValue():"");//预留字段1 +// jsonObject.put("vdef37", CAP4FormKit.getFieldStrValue(master, "预留字段2"));//预留字段2 + jsonObject.put("vdef37", formDataVo.getFieldData("预留字段2")!=null?formDataVo.getFieldData("预留字段2").getStringValue():"");//预留字段2 +// jsonObject.put("vdef38", CAP4FormKit.getFieldStrValue(master, "预留字段3"));//预留字段3 + jsonObject.put("vdef38", formDataVo.getFieldData("预留字段3")!=null?formDataVo.getFieldData("预留字段3").getStringValue():"");//预留字段3 +// jsonObject.put("vdef39", CAP4FormKit.getFieldStrValue(master, "预留字段4"));//预留字段4 + jsonObject.put("vdef39", formDataVo.getFieldData("预留字段4")!=null?formDataVo.getFieldData("预留字段4").getStringValue():"");//预留字段4 +// jsonObject.put("vdef40", CAP4FormKit.getFieldStrValue(master, "预留字段5"));//预留字段5 + jsonObject.put("vdef40", formDataVo.getFieldData("预留字段5")!=null?formDataVo.getFieldData("预留字段5").getStringValue():"");//预留字段5 +// jsonObject.put("rate", CAP4FormKit.getFieldStrValue(master, "中标费率"));//费率 + jsonObject.put("rate", formDataVo.getFieldData("中标费率")!=null?formDataVo.getFieldData("中标费率").getStringValue():"");//费率 + +// 期初标识 +// String earlySignid = CAP4FormKit.getFieldStrValue(master, "期初标识"); + String earlySignid = formDataVo.getFieldData("中标费率")!=null?formDataVo.getFieldData("中标费率").getDbValue()+"":""; + if("".equals(earlySignid)) { + jsonObject.put("earlySign", "");//期初标识 + }else { + String earlySign = getEnumManagerNew().getEnumItem(Long.parseLong(earlySignid)).getLabel(); + if("是".equals(earlySign)){ + jsonObject.put("earlySign", "Y");//期初标识 + }else { + jsonObject.put("earlySign", "");//期初标识 + } + } +// jsonObject.put("margin", CAP4FormKit.getFieldStrValue(master, "保证金"));//保证金 + jsonObject.put("margin", formDataVo.getFieldData("保证金")!=null?formDataVo.getFieldData("保证金").getStringValue():"");//保证金 +// jsonObject.put("gatherAccumulate", CAP4FormKit.getFieldStrValue(master, "期初已收款金额"));//累计收款 + jsonObject.put("gatherAccumulate", formDataVo.getFieldData("期初已收款金额")!=null?formDataVo.getFieldData("期初已收款金额").getStringValue():"");//累计收款 +// jsonObject.put("invoiceMoney", CAP4FormKit.getFieldStrValue(master, "期初已开票金额"));//开票金额 + jsonObject.put("invoiceMoney", formDataVo.getFieldData("期初已开票金额")!=null?formDataVo.getFieldData("期初已开票金额").getStringValue():"");//开票金额 + + JSONArray body = new JSONArray(); +// List formDataSubBeans = CAP4FormKit.getSubBeans(master,"合同条款信息"); + List subFormDataVos = formDataVo.getSubFormMap().get("合同条款信息"); + for (FormDataVo subFormDataVo : subFormDataVos) { + JSONObject json = new JSONObject(); +// json.put("vtermname", CAP4FormKit.getSubFieldValue(formDataSubBean,"条款名称")); //条款名称 + json.put("vtermname", subFormDataVo.getFieldData("条款名称")!=null?subFormDataVo.getFieldData("条款名称").getStringValue():""); //条款名称 +// json.put("vtermcontent", CAP4FormKit.getSubFieldValue(formDataSubBean,"条款内容")); //条款内容 + json.put("vtermcontent", subFormDataVo.getFieldData("条款内容")!=null?subFormDataVo.getFieldData("条款内容").getStringValue():""); //条款内容 +// json.put("vmemo", CAP4FormKit.getSubFieldValue(formDataSubBean,"备注")); //备注 + json.put("vmemo", subFormDataVo.getFieldData("备注")!=null?subFormDataVo.getFieldData("备注").getStringValue():""); //备注 +// json.put("planStartDate", CAP4FormKit.getFieldStrValue(master, "合同开始日期")); //备注 + json.put("planStartDate", formDataVo.getFieldData("合同开始日期")!=null?formDataVo.getFieldData("合同开始日期").getStringValue():""); //备注 +// json.put("planEndDate", CAP4FormKit.getFieldStrValue(master, "合同结束日期")); //备注 + json.put("planEndDate", formDataVo.getFieldData("合同结束日期")!=null?formDataVo.getFieldData("合同结束日期").getStringValue():""); //备注 + body.add(json); + } + jsonObject.put("body", body);//收款计划的集合 +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/OrdinaryContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPHTFK_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + /** + * 一般收款合同参数封装 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getOrdinaryContractSKStopParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("vbillcode", CAP4FormKit.getFieldStrValue(master, "合同编号"));//合同编号 + jsonObject.put("vbillcode", formDataVo.getFieldData("合同编号")!=null?formDataVo.getFieldData("合同编号").getStringValue():"");//合同编号 +// jsonObject.put("vexecdate", CAP4FormKit.getFieldStrValue(master, "单据日期"));//单据日期 + jsonObject.put("vexecdate", formDataVo.getFieldData("单据日期")!=null?formDataVo.getFieldData("单据日期").getStringValue():"");//单据日期 +// jsonObject.put("terminateReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminateReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 +// String businessTypeId = CAP4FormKit.getFieldStrValue(master, "业务类型"); + String businessTypeId = formDataVo.getFieldData("业务类型")!=null?formDataVo.getFieldData("业务类型").getDbValue()+"":""; + String businessType = getEnumManagerNew().getEnumItem(Long.parseLong(businessTypeId)).getLabel(); + jsonObject.put("businessType", businessType);//终止类型 +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/OrdinaryContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPSKZZ_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + /** + * 一般付款合同参数封装 + * @param formDataVo + * @return + * @throws IOException + * @throws BusinessException + */ + public JSONObject getOrdinaryContractFKStopParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// jsonObject.put("vbillcode", CAP4FormKit.getFieldStrValue(master, "合同编号"));//合同编号 + jsonObject.put("vbillcode", formDataVo.getFieldData("合同编号")!=null?formDataVo.getFieldData("合同编号").getStringValue():"");//合同编号 +// jsonObject.put("vexecdate", CAP4FormKit.getFieldStrValue(master, "单据日期"));//单据日期 + jsonObject.put("vexecdate", formDataVo.getFieldData("单据日期")!=null?formDataVo.getFieldData("单据日期").getStringValue():"");//单据日期 +// jsonObject.put("terminateReason", CAP4FormKit.getFieldStrValue(master, "终止原因"));//终止原因 + jsonObject.put("terminateReason", formDataVo.getFieldData("终止原因")!=null?formDataVo.getFieldData("终止原因").getStringValue():"");//终止原因 +// String businessTypeId = CAP4FormKit.getFieldStrValue(master, "业务类型"); + String businessTypeId = formDataVo.getFieldData("业务类型")!=null?formDataVo.getFieldData("业务类型").getDbValue()+"":""; + String businessType = getEnumManagerNew().getEnumItem(Long.parseLong(businessTypeId)).getLabel(); + jsonObject.put("businessType", businessType);//终止类型 +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/OrdinaryContractjson/"+date.substring(0,4)+"/"+date.substring(4,6)+"/"+date.substring(6,8)+"/BIPFKZZ_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/constants/GeneralmatterConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/constants/GeneralmatterConstants.java new file mode 100644 index 0000000..0ba8dae --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/constants/GeneralmatterConstants.java @@ -0,0 +1,26 @@ +package com.seeyon.apps.src_generalmatter.constants; + +public enum GeneralmatterConstants { + plugin("src_generalmatter","插件ID"); + + GeneralmatterConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/event/GeneralmatterEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/event/GeneralmatterEvent.java new file mode 100644 index 0000000..79a98ca --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/event/GeneralmatterEvent.java @@ -0,0 +1,67 @@ +package com.seeyon.apps.src_generalmatter.event; + +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_generalmatter.kit.form.CAP4FormKit; +import com.seeyon.apps.src_generalmatter.unit.HeaderUtil; +import com.seeyon.apps.src_generalmatter.unit.ParamUtil; +import com.seeyon.apps.src_generalmatter.unit.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.constants.ApplicationCategoryEnum; +import com.seeyon.ctp.workflow.event.AbstractWorkflowEvent; +import com.seeyon.ctp.workflow.event.WorkflowEventData; +import com.seeyon.ctp.workflow.event.WorkflowEventResult; + +public class GeneralmatterEvent extends AbstractWorkflowEvent{ + +private static final Log log = LogFactory.getLog(GeneralmatterEvent.class); + + @Override + public String getId() { + return "generalmatterEvent"; + } + + @Override + public String getLabel() { + return "OA通用事项审批终止流程监听"; + } + + @Override + public ApplicationCategoryEnum getAppName() { + return ApplicationCategoryEnum.form; + } + + @Override + public WorkflowEventResult onBeforeStop(WorkflowEventData data) { + WorkflowEventResult workflowEventResult = new WorkflowEventResult(); + System.out.println("进入终止操作"); + try { + Map map = data.getBusinessData(); + FormDataMasterBean master = (FormDataMasterBean) map.get("formDataBean"); + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + JSONObject jsonObject = paramUtil.getGeneralmatterStopParam(master); + String url = CAP4FormKit.getFieldStrValue(master, "来源推送地址"); + log.info("接口终止,参数记录:"+jsonObject); + JSONObject res = ProtUtil.doPost(jsonObject, url, headerer); + if(res.isEmpty()) { + workflowEventResult.setAlertMessage("请求失败"); + return workflowEventResult; + } + String status = res.getString("status"); + if(!"1".equals(status)) { + workflowEventResult.setAlertMessage(res.getString("msg")); + return workflowEventResult; + } + }catch (Exception e) { + workflowEventResult.setAlertMessage(e.getMessage()); + return workflowEventResult; + } + return null; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/DateKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/DateKit.java new file mode 100644 index 0000000..ede7759 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/DateKit.java @@ -0,0 +1,293 @@ +package com.seeyon.apps.src_generalmatter.kit; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 日期处理工具类 + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class DateKit { + + private static SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd"); + + private static SimpleDateFormat sixFormat = new SimpleDateFormat("yyMMdd"); + + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private static SimpleDateFormat dayFormat = new SimpleDateFormat("yyyy-MM-dd"); + + private static SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM"); + + private static SimpleDateFormat weekDay = new SimpleDateFormat("MM-dd"); + + private static SimpleDateFormat hour = new SimpleDateFormat("HH:mm"); + + private static SimpleDateFormat detailDate = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + + private static final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五","星期六" }; + + public static int getYear(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } + + public static String getSixDate() { + return getSixDate(null); + } + + public static String getSixDate(Date date) { + if(null == date) { + return sixFormat.format(new Date()); + } + return sixFormat.format(date); + } + + /** + * 获取这个时间属于一年的第几周 + * @param date + * @return + */ + public static int getWeekNum(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int week = cal.get(Calendar.WEEK_OF_YEAR); + // 如果是星期天,那么需要减1 + if("星期日".equals(DateKit.getDayWeekName(date))) { + week -= 1; + } + return week; + } + + /** + * Description: + * + *
+     * 获取一周
+     * 
+ * + * @param date + * @return + */ + public static void getWeekInterval(Map param) { + Calendar cal = Calendar.getInstance(); + // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 + if(1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + // 获得当前日期是一个星期的第几天 + int day = cal.get(Calendar.DAY_OF_WEEK); + // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 + cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); + param.put("startDate", cal.getTime()); + // System.out.println("所在周星期一的日期:" + imptimeBegin); + cal.add(Calendar.DATE, 6); + param.put("endDate", cal.getTime()); + // System.out.println("所在周星期日的日期:" + imptimeEnd); + } + + /** + * Description: + * + *
+     * 根据传入的日期,获取当前日期所在的一周时间段
+     * 
+ * + * @param date + * @return + */ + public static void getWeekInterval(Map param, Date now) { + Calendar cal = Calendar.getInstance(); + cal.setTime(now); + // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 + int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天 + if(1 == dayWeek) { + cal.add(Calendar.DAY_OF_MONTH, -1); + } + // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 + // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 + cal.setFirstDayOfWeek(Calendar.MONDAY); + // 获得当前日期是一个星期的第几天 + int day = cal.get(Calendar.DAY_OF_WEEK); + // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 + cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); + String time = DateKit.getDayDate(cal.getTime()) + " 00:00:00"; + try { + param.put("beginDate", DateKit.getdayDate(time)); + } catch(Exception e) { + // TODO + } + // System.out.println("所在周星期一的日期:" + imptimeBegin); + cal.add(Calendar.DATE, 6); + time = DateKit.getDayDate(cal.getTime()) + " 23:59:59"; + try { + param.put("endDate", DateKit.getdayDate(time)); + } catch(Exception e) { + // + } + // System.out.println("所在周星期日的日期:" + imptimeEnd); + } + + public static String getSimpleDate(Date date) { + if(date == null) { + return ""; + } + return simple.format(date); + } + + /** + * 给日志格式化使用 + * @param date + * @return + */ + public static String getDate4Cal(Date date) { + if(date == null) { + return ""; + } + return hour.format(date); + } + + public static String getDateString(Date date) { + if(date == null) { + return ""; + } + return sdf.format(date); + } + + public static String getDayDate(Date date) { + if(date == null) { + return ""; + } + return dayFormat.format(date); + } + + public static String getWeekDay(Date date) { + if(date == null) { + return ""; + } + return weekDay.format(date); + } + + /** + * Description: + * + *
+     * 获取多少天以后的日期
+     * 
+ * + * @param day + * @return + */ + public static Date getDayAfter(int day) { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, day); + return cal.getTime(); + } + // 获得某天的几天后 + public static Date getDayAfter(Date d, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.DATE, day); + return cal.getTime(); + } + + /** + * 获取一个月有多少天 + * @param year + * @param month + * @return + */ + public static int getDaysByYearMonth(int year, int month) { + Calendar a = Calendar.getInstance(); + a.set(Calendar.YEAR, year); + a.set(Calendar.MONTH, month); + a.set(Calendar.DATE, 1); + a.roll(Calendar.DATE, -1); + int maxDate = a.get(Calendar.DATE); + return maxDate; + } + + /** + * 获取今天是星期几 + * @param date + * @return + */ + public static String getDayWeekName(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; + if(dayOfWeek < 0) + dayOfWeek = 0; + return dayNames[dayOfWeek]; + } + + /** + * 解析时间,先解析yyyy-MM-dd HH:mm:ss + * @param dateStr + * @return + * @throws ParseException + * @throws Exception + */ + public static Date getdayDate(String dateStr) throws Exception { + try { + return sdf.parse(dateStr); + } catch(Exception e) { + try { + return detailDate.parse(dateStr); + } catch(Exception e1) { + try { + return dayFormat.parse(dateStr); + } catch(Exception e2) { + try { + return simple.parse(dateStr); + } + catch(Exception e3) { + return monthFormat.parse(dateStr); + } + } + } + } + } + + /** + * 根据时间获取周区间字符串 + * @param now + * @return 第XX周:2018-08-27至2018-09-02 + */ + public static String getWeekNumAndDateZone(Date now) { + StringBuffer sb = new StringBuffer(); + sb.append("第"); + sb.append(getWeekNum(now)); + sb.append("周:"); + Map param = new HashMap(); + getWeekInterval(param, now); + Date beginDate = (Date)param.get("beginDate"); + Date endDate = (Date)param.get("endDate"); + sb.append(dayFormat.format(beginDate)); + sb.append("至"); + sb.append(dayFormat.format(endDate)); + return sb.toString(); + } + + /** + * 根据日期和时间获取一个返回该日期该时间的date + * @param d 日期 + * @param time 时间 HH:mm格式 + * @return d日期+time时间 + * @throws ParseException + */ + public static Date getDateFromTime(Date d, String time) throws ParseException { + String dateTime = dayFormat.format(d) + " " + time; + return detailDate.parse(dateTime); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/StrKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/StrKit.java new file mode 100644 index 0000000..70d88c0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/StrKit.java @@ -0,0 +1,251 @@ +package com.seeyon.apps.src_generalmatter.kit; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 字符处理工具类 + * @date 2018年5月23日上午9:05:01 + * @Copyright Beijing Seeyon Software Co.,LTD + */ +public class StrKit { + + public static String str(Object o) { + if(o == null) { + return null; + } + if(o instanceof Date) { + return DateKit.getDayDate((Date)o); + } + if(o instanceof Timestamp) { + return DateKit.getDayDate((Timestamp)o); + } + if(o instanceof String) { + return (String)o; + } + return o.toString(); + } + + public static String str(Object o, boolean null2Str) { + if(o == null && null2Str) { + return ""; + } + return str(o); + } + + public static float toFloat(Object o) { + if(o == null) { + return 0f; + } else if(o instanceof Float) { + return (Float)o; + } else if(o instanceof String) { + return Float.valueOf((String)o); + } else if(o instanceof BigDecimal) { + return ((BigDecimal)o).floatValue(); + } + return 0f; + } + + public static Long toLong(Object o) { + if(null == o) { + return 0L; + } else if(o instanceof Long) { + return (Long)o; + } else if(o instanceof String) { + if("".equals(o)) { + return 0L; + } + return Long.valueOf((String)o); + } else if(o instanceof BigDecimal) { + return ((BigDecimal)o).longValue(); + } + return 0L; + } + + /** + * 取int值,为空返回0 + * @param obj 对象 + * @return + */ + public static Integer toInteger(Object obj) { + if(obj == null) { + return 0; + } else if(obj instanceof Long){ + return ((Long)obj).intValue(); + } else if(obj instanceof BigDecimal) { + return ((BigDecimal)obj).intValue(); + }else if(obj instanceof String) { + String o = (String) obj; + if("".equals(o)) { + return 0; + } else { + try { + return Integer.valueOf((String) obj); + } catch(Exception e) { + return 0; + } + } + } else if(obj instanceof Integer) { + return (Integer) obj; + } + return 0; + } + + public static Date toDate(Object o) throws Exception { + if(null == o) { + return null; + } else if(o instanceof Date) { + return (Date)o; + } else if(o instanceof Timestamp) { + return ((Timestamp) o); + } else if(o instanceof String){ + return DateKit.getdayDate((String) o); + } + return null; + } + + public static List toList(Object o) { + if(o == null) { + return null; + } else if(o instanceof List) { + return (List) o; + } else { + return null; + } + } + + /** + * 判断对象是否为空 + * @param o + * @return + */ + public static boolean isNull(Object o) { + if(null == o) { + return true; + } + if(o instanceof String) { + return "".equals((String) o); + } + if(o instanceof Collection) { + // 集合数量为0 则为空 + return ((Collection) o).size() == 0; + } + return false; + } + + /** + * 删除最后一个字符 + * @param input + * @return + */ + public static String deleteLastChar(String input) { + if(isNull(input)) + return ""; + return input.substring(0, input.length() - 1); + + } + + /** + * 转换成 123,456,789的格式 + * @param inputString + * @param length + * @return + */ + public static String getListStr(String inputString, int length) { + if(isNull(inputString)) + return ""; + String str = ""; + List strList = getStrList(inputString, length); + for(String string : strList) { + str += string + ","; + } + return deleteLastChar(str); + } + + /** + * 把原始字符串分割成指定长度的字符串列表 + * + * @param inputString + * 原始字符串 + * @param length + * 指定长度 + * @return + */ + public static List getStrList(String inputString, int length) { + int size = inputString.length() / length; + if (inputString.length() % length != 0) { + size += 1; + } + return getStrList(inputString, length, size); + } + + /** + * 把原始字符串分割成指定长度的字符串列表 + * + * @param inputString + * 原始字符串 + * @param length + * 指定长度 + * @param size + * 指定列表大小 + * @return + */ + private static List getStrList(String inputString, int length, + int size) { + List list = new ArrayList(); + for (int index = 0; index < size; index++) { + String childStr = substring(inputString, index * length, + (index + 1) * length); + list.add(childStr); + } + return list; + } + + /** + * 分割字符串,如果开始位置大于字符串长度,返回空 + * + * @param str + * 原始字符串 + * @param f + * 开始位置 + * @param t + * 结束位置 + * @return + */ + private static String substring(String str, int f, int t) { + if (f > str.length()) + return null; + if (t > str.length()) { + return str.substring(f, str.length()); + } else { + return str.substring(f, t); + } + } + + public static String getFixedLengthStr(String str, int length) { + // 如果为空,返回全部都是0 + if(length < 1) { + return ""; + } + if(isNull(str)) { + return getZeor(length); + } + if(str.length() < length) { + return getZeor(length - str.length()) + str; + } + return str.substring(0, length); + } + + private static String getZeor(int length) { + String str = ""; + for(int i = 0; i < length; i++) { + str += "0"; + } + return str; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/form/CAP4FormKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/form/CAP4FormKit.java new file mode 100644 index 0000000..d97878b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/kit/form/CAP4FormKit.java @@ -0,0 +1,206 @@ +package com.seeyon.apps.src_generalmatter.kit.form; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.seeyon.apps.src_generalmatter.kit.StrKit; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormDataBean; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.cap4.form.service.CAP4FormManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; + + +/** + * Description + *

+ * @author FanGaowei
+ * Date 2018年1月23日 上午11:22:28
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class CAP4FormKit { + + private static final Log LOGGER = CtpLogFactory.getLog(CAP4FormKit.class); + + public static FormBean getFormBean(CAP4FormManager cap4FormManager, String code) { + FormBean formBean = null; + try { + formBean = cap4FormManager.getFormByFormCode(code); + } catch(BusinessException e) { + LOGGER.error("获取表单发生异常,编号:" + code, e); + } + return formBean; + } + + /** + * 根据表单的显示名称获取字段的值 + * @param bean + * @param disPlay + * @return + */ + public static Object getFieldValue(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return bean.getFieldValue(field.getName()); + } + + + public static int getIntValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.toInteger(value); + } + + public static String getFieldStrValue(FormDataBean bean, String disPlay) { + Object value = getFieldValue(bean, disPlay); + return StrKit.str(value, true); + } + + public static Object getFieldValueByName(FormDataBean bean, String fieldName) { + return bean.getFieldValue(fieldName); + } + + /** + * 根据表单的显示名称获取字段是 field000? + * @param bean + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getMasterTableBean(); + return getFieldTaleId(table, disPlay); + } + + /** + * 直接根据table来获取 + * @param table + * @param disPlay + * @return + */ + public static String getFieldTaleId(FormTableBean table, String disPlay) { + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + LOGGER.info("字段不存在:" + disPlay); + return null; + } + return field.getName(); + } + + public static String getFieldTaleId(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(field == null) { + return null; + } + return field.getName(); + } + + public static FormFieldBean getFieldBean(FormDataBean bean, String disPlay) { + if(bean == null) { + return null; + } + FormTableBean table = bean.getFormTable(); + if(table == null) { + return null; + } + FormFieldBean field = table.getFieldBeanByDisplay(disPlay); + if(null == field) { + LOGGER.info("字段不存在:" + disPlay); + } + return field; + } + + + /** + * Description: + *

+	 * @param bean 这里的bean必须是getMasterBean() 方法获取到的bean
+	 * @param disPlay 
+	 * @param value
+	 */
+	public static void setCellValue(FormDataBean bean, String disPlay, Object value) {
+		FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+		if(cell != null) {
+			bean.addFieldValue(cell.getName(), value);
+		}
+	}
+	
+	public static void setCellValue(FormDataSubBean bean, String disPlay, Object value) {
+        FormFieldBean cell = CAP4FormKit.getFieldBean(bean, disPlay);
+        if(cell != null) {
+            bean.addFieldValue(cell.getName(), value);
+        }
+    }
+	
+	/**
+	 * Description:
+	 * 
只适用于只有一个子表的表单
+ * @param colManager + * @param data + * @return + * @throws Exception + */ + public static List getSubBeans(FormDataMasterBean master) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + return subs.get(key); + } + return null; + } + + public static List getSubBeans(FormDataMasterBean master, String display) { + Map> subs = master.getSubTables(); + if(null == subs) { + return null; + } + for(String key : subs.keySet()) { + FormDataSubBean data = subs.get(key).get(0); + if(display.equals(data.getFormTable().getDisplay())) { + return subs.get(key); + } + } + LOGGER.info("表单不存在:" + display); + return null; + } + + /** + * Description: + *
获取从表字段
+ * @param sub + * @param disPlay + * @return + */ + public static Object getSubFieldValue(FormDataSubBean sub, String disPlay) { + return getFieldValue(sub, disPlay); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/node/GeneralmatterNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/node/GeneralmatterNode.java new file mode 100644 index 0000000..314d6e8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/node/GeneralmatterNode.java @@ -0,0 +1,97 @@ +package com.seeyon.apps.src_generalmatter.node; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_generalmatter.constants.GeneralmatterConstants; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_generalmatter.unit.HeaderUtil; +import com.seeyon.apps.src_generalmatter.unit.ParamUtil; +import com.seeyon.apps.src_generalmatter.unit.ProtUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; + +public class GeneralmatterNode extends ACommonSuperNode { + + private static final Log log = Log.get(GeneralmatterNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "generalmatterNode"; + } + + @Override + public String getNodeName() { + return "OA通用事项审批完成超级节点"; + } + + + @Override + public String getPluginId() { + return GeneralmatterConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + public ConfigVo getGeneralmatterConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + //进入超级审核节点 + log.info("进入流程"+getNodeId()); + ConfigVo configVo = getGeneralmatterConfig(); + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); +// 封装推送接口参数调用接口 + try { + JSONObject headerer = HeaderUtil.getHeader(); + ParamUtil paramUtil = new ParamUtil(); + JSONObject jsonObject = paramUtil.getGeneralmatterFinishParam(formDataVo); +// String url = CAP4FormKit.getFieldStrValue(master, "来源推送地址"); + String url = formDataVo.getFieldData("来源推送地址")!=null?formDataVo.getFieldData("来源推送地址").getStringValue():""; +// String ly = CAP4FormKit.getFieldStrValue(master, "来源系统"); + String ly = formDataVo.getFieldData("来源系统")!=null?formDataVo.getFieldData("来源系统").getStringValue():""; + context.setUrl(url); + context.setRequest(jsonObject.toString()); + JSONObject res = ProtUtil.doPost(jsonObject, url, headerer); + context.setResponse(res.toString()); + if(res==null) { + context.back("推送单据失败:接口调用失败,未正常返回结果"); + formDataVo.getNewFieldDataMap().put("NC返回结果", "推送单据失败:接口调用失败,未正常返回结果"); + return context; + } + String status = res.getString("status"); + String msg = res.get("msg").toString(); + if(!"1".equals(status)) { + log.info("推送单据失败:"+msg); + context.success("推送单据失败:"+msg); + formDataVo.getNewFieldDataMap().put("NC返回结果", "推送单据失败:"+msg); + }else { + log.info( "推送"+ly+"单据成功:"+msg); + context.back( "推送"+ly+"单据成功:"+msg); + formDataVo.getNewFieldDataMap().put("NC返回结果", "推送"+ly+"单据成功:"+msg); + } + } catch (Exception e) { + log.error("异常:"+ e); + context.back("异常:"+ e); + formDataVo.getNewFieldDataMap().put("NC返回结果", "推送单据失败:"+e); + e.printStackTrace(); + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/HeaderUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/HeaderUtil.java new file mode 100644 index 0000000..afadf4d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/HeaderUtil.java @@ -0,0 +1,27 @@ +package com.seeyon.apps.src_generalmatter.unit; + +import java.io.UnsupportedEncodingException; +import java.util.Base64; +import java.util.Date; + +import org.apache.commons.codec.digest.DigestUtils; + +import com.alibaba.fastjson.JSONObject; + +public class HeaderUtil { + + public static JSONObject getHeader() throws UnsupportedEncodingException{ + JSONObject headerer = new JSONObject(); + headerer.put("Content-Type", "application/json;charset=utf-8"); + Date date = new Date(); + String ts = date.getTime()+""; + headerer.put("ts", ts); + headerer.put("client_id", "OA"); + headerer.put("client_security", "30dcf9a3cfef4b98a157e926db6369f0"); + String p=ts+"30dcf9a3cfef4b98a157e926db6369f0"; + byte[] bytes = DigestUtils.md5(p.getBytes("UTF-8")); // md5 + String signature= Base64.getEncoder().encodeToString(bytes); //base64 + headerer.put("signature", signature); + return headerer; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/ParamUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/ParamUtil.java new file mode 100644 index 0000000..9f89d04 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/ParamUtil.java @@ -0,0 +1,80 @@ +package com.seeyon.apps.src_generalmatter.unit; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import org.apache.commons.io.FileUtils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.jync_file.kit.form.CAP4FormKit; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.cap4.form.bean.FormDataSubBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.v3x.dee.util.DateUtil; + +public class ParamUtil { + + private EnumManager enumManagerNew; + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) { + enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + } + return enumManagerNew; + } + + /** + * 通用事项终止参数 + * @param master + * @return + * @throws IOException + */ + public JSONObject getGeneralmatterStopParam(FormDataMasterBean master) throws IOException{ + JSONObject jsonObject = new JSONObject(); + System.out.println("设置通用事项终止参数"); + jsonObject.put("billcode", CAP4FormKit.getFieldStrValue(master, "来源单据主键")); + jsonObject.put("notes", CAP4FormKit.getFieldStrValue(master, "说明事项")); + jsonObject.put("status", "0"); + System.out.println("通用通用事项终止参数:"+jsonObject); + String str = SystemEnvironment.getApplicationFolder(); + String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + FileUtils.writeStringToFile(new File(str+"/bipjson/"+date.substring(0,4)+"/"+date.substring(5,6)+"/"+date.substring(7,8)+"/TYSXZZ_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + + + /** + * 通用事项完成参数 + * @param formDataVo + * @return + * @throws IOException + */ + public JSONObject getGeneralmatterFinishParam(FormDataVo formDataVo) throws NoSuchFieldException { + JSONObject jsonObject = new JSONObject(); +// System.out.println("设置通用事项终止参数"); +// jsonObject.put("billcode", CAP4FormKit.getFieldStrValue(master, "来源单据主键")); + jsonObject.put("billcode", formDataVo.getFieldData("来源单据主键")!=null?formDataVo.getFieldData("来源单据主键").getStringValue():""); +// jsonObject.put("notes", CAP4FormKit.getFieldStrValue(master, "说明事项")); + jsonObject.put("notes", formDataVo.getFieldData("说明事项")!=null?formDataVo.getFieldData("说明事项").getStringValue():""); + jsonObject.put("status", "1"); +// System.out.println("通用通用事项终止参数:"+jsonObject); +// String str = SystemEnvironment.getApplicationFolder(); +// String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); +// FileUtils.writeStringToFile(new File(str+"/bipjson/"+date.substring(0,4)+"/"+date.substring(5,6)+"/"+date.substring(7,8)+"/TYSXJS_" + date + ".json"), jsonObject.toString(), "UTF-8"); + return jsonObject; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/ProtUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/ProtUtil.java new file mode 100644 index 0000000..8cebef0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_generalmatter/unit/ProtUtil.java @@ -0,0 +1,132 @@ +package com.seeyon.apps.src_generalmatter.unit; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpResponse; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import com.alibaba.fastjson.JSONObject; + +public class ProtUtil { + private static final Log log = LogFactory.getLog(ProtUtil.class); + + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public static JSONObject doPost(JSONObject param, String urlStr,JSONObject headerer) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + System.out.println(urlStr); + try { + URL url = new URL(urlStr); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", headerer.getString("Content-Type")); + connection.setRequestProperty("ts", headerer.getString("ts")); + connection.setRequestProperty("client_id", headerer.getString("client_id")); + connection.setRequestProperty("client_security", headerer.getString("client_security")); + connection.setRequestProperty("signature", headerer.getString("signature")); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + String str = param.toString(); + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + System.out.println(connection.getResponseCode()); + log.info("调用接口,返回状态"+connection.getResponseCode()); + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + System.out.println(result); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/dao/IGetTaxRateDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/dao/IGetTaxRateDao.java new file mode 100644 index 0000000..6419df8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/dao/IGetTaxRateDao.java @@ -0,0 +1,13 @@ +package com.seeyon.apps.src_gettaxrate.dao; + +import com.seeyon.apps.src_gettaxrate.util.CommonResult; + +/** +* @author zhaoyang: +* @version 创建时间:2024年11月30日 下午10:09:51 +* 类说明 +*/ +public interface IGetTaxRateDao { + public CommonResult getTaxRateExecute(String taxnum, String taxtype); + public CommonResult getTaxRateExecute2(String taxnum, String taxtype); +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/dao/IGetTaxRateDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/dao/IGetTaxRateDaoImpl.java new file mode 100644 index 0000000..c735f3e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/dao/IGetTaxRateDaoImpl.java @@ -0,0 +1,131 @@ +package com.seeyon.apps.src_gettaxrate.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_gettaxrate.util.BaseUtil; +import com.seeyon.apps.src_gettaxrate.util.CommonResult; +import com.seeyon.cap4.util.StringUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.util.JDBCAgent; + +/** + * @author zhaoyang: + * @version 创建时间:2024年11月30日 下午10:11:07 类说明 + */ +public class IGetTaxRateDaoImpl extends BaseUtil implements IGetTaxRateDao { + private static final Log log = CtpLogFactory.getLog(IGetTaxRateDaoImpl.class); + + @Override + public CommonResult getTaxRateExecute(String taxnum, String taxtype) { + JSONArray jsonArray = new JSONArray(); + try { + String sql = ""; + ResultSet rs = null; + // 如果纳税人识别号或者税目都有数据 +// System.out.println(taxnum+taxtype); + if (!StringUtil.isEmpty(taxnum) && !StringUtil.isEmpty(taxtype)) { + Object[] params = new Object[] { taxnum, taxtype }; + sql = "SELECT * FROM SXLY_PUB_ORG_TAXRATE WHERE ORGTAXNUMBER= ? AND TAXTYPECODE= ? "; + rs = super.executeQuery(sql, params); +// System.out.println(sql); + } else {// 两个参数有一个存在空,获取所有数据 + sql = "SELECT * FROM SXLY_PUB_ORG_TAXRATE"; + rs = super.executeQuery2(sql); +// System.out.println(sql); + } + while (rs.next()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("DAPK", checkData(rs, "DAPK")); + jsonObject.put("ORGTAXNUMBER", checkData(rs, "ORGTAXNUMBER")); + jsonObject.put("ORGTAXTYPE", checkData(rs, "ORGTAXTYPE")); + jsonObject.put("ORGTAXTYPENAME", checkData(rs, "ORGTAXTYPENAME")); + jsonObject.put("ORGNAME", checkData(rs, "ORGNAME")); + jsonObject.put("TAXTYPECODE", checkData(rs, "TAXTYPECODE")); + jsonObject.put("TAXTYPENAME", checkData(rs, "TAXTYPENAME")); + jsonObject.put("TAXRATE", checkData(rs, "TAXRATE")); + jsonArray.add(jsonObject); + } + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + return new CommonResult("fail", "税率查询失败", e.getMessage()); + } + return new CommonResult("success", "税率查询成功", jsonArray); + } + + + public String checkData(ResultSet rs,String str) { + try { + if(rs.getString(str)!=null) { + return rs.getString(str); + }else { + return ""; + } + } catch (SQLException e) { + e.printStackTrace(); + return ""; + } + } + + + @Override + public CommonResult getTaxRateExecute2(String taxnum, String taxtype) { + JSONArray jsonArray = new JSONArray(); + try { + JDBCAgent agent = new JDBCAgent(); + List p = new ArrayList(); + String sql = ""; + List list = null; + if (!StringUtil.isEmpty(taxnum) && !StringUtil.isEmpty(taxtype)) { + sql = "SELECT * FROM SXLY_PUB_ORG_TAXRATE WHERE ORGTAXNUMBER= '" + taxnum + "' AND TAXTYPECODE= '" + + taxtype + "' "; + agent.execute(sql.toString(), p); + list = agent.resultSetToList(); + for (Map map : list) { + JSONObject json = new JSONObject(); + json.put("taxrate",checkMapData(map,"taxrate")); + jsonArray.add(json); + } + } else {// 两个参数有一个存在空 + String res = "两个必填参数都不能为空!请检查参数:"; + if(StringUtil.isEmpty(taxnum)) { + res = res+" taxnum(纳税人识别号)为空!"; + } + if(StringUtil.isEmpty(taxtype)) { + res = res+" taxtype(税目)为空!"; + } + return new CommonResult("fail", res, null); + } + + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + return new CommonResult("fail", "税率查询失败", e.getMessage()); + } + return new CommonResult("success", "税率查询成功", jsonArray); + } + + + public String checkMapData(Map map,String str) { + try { + if(map.get(str)!=null) { + return map.get(str).toString(); + }else { + return ""; + } + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/BaseUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/BaseUtil.java new file mode 100644 index 0000000..bcd2788 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/BaseUtil.java @@ -0,0 +1,131 @@ +package com.seeyon.apps.src_gettaxrate.util; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + + + +public class BaseUtil { + + + PreparedStatement ps = null; + ResultSet res = null; + Connection conn =null; + /** + * sql查询工具 + * @param sql sql语句 + * @param params sql参数 + * @return 结果集 + */ + public ResultSet executeQuery(String sql, Object[] params) + { + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++){ + ps.setObject(i+1, params[i]); + } + res = ps.executeQuery(); + } catch (SQLException e) { + e.printStackTrace(); + } + return res; + } + + public ResultSet executeQuery2(String sql) + { + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + res = ps.executeQuery(); + } catch (SQLException e) { + e.printStackTrace(); + } + return res; + } + + + /** + * sql更新工具 + * @param sql + * @param params + * @return + */ + public int executeUpdate(String sql, Object[] params) + { + int res = 0; + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++) + { + ps.setObject(i+1, params[i]); + } + res = ps.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + return res; + } + public int executeUpdate2(String sql) + { + int res = 0; + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + res = ps.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + return res; + } + + + + + public void close() { + release(res,null,conn,ps); + } + //定义一个释放资源的方法; + /* + * 定义一个方法: 释放资源: 直接将rs stmt conn 全部释放: + */ + public static void release(ResultSet rs ,Statement stmt , Connection conn,PreparedStatement ps){ + if(rs!=null){ + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + rs=null; + } + if(stmt!=null){ + try { + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + stmt=null; + } + if(conn!=null){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + conn=null; + } + if(ps!=null){ + try { + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + ps=null; + } + + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/CommonResult.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/CommonResult.java new file mode 100644 index 0000000..3500f5c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/CommonResult.java @@ -0,0 +1,55 @@ +package com.seeyon.apps.src_gettaxrate.util; +/** +* @author zhaoyang: +* @version 创建时间:2024年10月16日 下午4:56:55 +* 类说明 +*/ +public class CommonResult { + private String statusCode; + private String message; + private Object data; + + // 构造函数,用于创建成功的Result对象 + public CommonResult(String statusCode, String message, Object data) { + this.statusCode = statusCode; + this.message = message; + this.data = data; + } + + // 构造函数,用于创建失败的Result对象 + public CommonResult(String statusCode, String message) { + this.statusCode = statusCode; + this.message = message; + } + + // Getter和Setter方法 + public String getStatusCode() { + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + + @Override + public String toString() { + return "Result{" + "statusCode=" + statusCode + ", message='" + message + '\'' + ", data=" + data + '}'; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/JdbcUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/JdbcUtil.java new file mode 100644 index 0000000..6d802e6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_gettaxrate/util/JdbcUtil.java @@ -0,0 +1,78 @@ +package com.seeyon.apps.src_gettaxrate.util; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import com.seeyon.ctp.common.SystemEnvironment; + + + + public class JdbcUtil { + private static String url; + private static String user; + private static String password; + + + // 获取数据库连接 + public static Connection getConnection() { + Connection conn = null; + // 配置文件路径 + String configFilePath = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_gettaxrate/pa.properties"; + // 加载配置文件 + Properties properties = new Properties(); + try (FileInputStream inputStream = new FileInputStream(configFilePath)) { + properties.load(inputStream); + } catch (IOException e) { + e.printStackTrace(); + } + try { + String driverClassName = properties.getProperty("jdbc_driver"); + Class.forName(driverClassName); + url = properties.getProperty("jdbc_url"); + user = properties.getProperty("jdbc_user"); + password = properties.getProperty("jdbc_password"); + conn = DriverManager.getConnection(url, user, password); + } catch (Exception e) { + e.printStackTrace(); + } + return conn; + } + + // 释放资源 + public static void close(Connection conn, Statement stat, ResultSet rs) { + close(conn, stat); + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + // 释放资源 + public static void close(Connection conn, Statement stat) { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (stat != null) { + try { + stat.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/HxinvoiceCommonNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/HxinvoiceCommonNode.java new file mode 100644 index 0000000..bc83ef3 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/HxinvoiceCommonNode.java @@ -0,0 +1,414 @@ +package com.seeyon.apps.src_hxinvoice; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.util.*; +import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse; +import com.seeyon.cap4.form.api.FormDataApi4Cap4; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.util.UUIDLong; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.TreeMap; + + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public abstract class HxinvoiceCommonNode extends ACommonSuperNode { + + private static Log log = Log.get(HxinvoiceCommonNode.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getPluginId() { + return HxinvoiceConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + public ConfigVo getHxinvoiceConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + protected FormDataApi4Cap4 formDataApi4Cap4; + + public void setFormDataApi4Cap4(FormDataApi4Cap4 formDataApi4Cap4) { + this.formDataApi4Cap4 = formDataApi4Cap4; + } + + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + ConfigVo configVo = getHxinvoiceConfig(); + SuperNodeContext context = new SuperNodeContext(); + Cap4ReturnUtil cap4ReturnUtil = new Cap4ReturnUtil(); + FieldDataVo fhjg = formDataVo.getFieldData("电子税票系统返回结果"); + String fhvalue = fhjg.getStringValue(); + try { + if("AddGenerateQdBdczlInvoiceNode".equals(getNodeId()) || "AddGenerateQdBdczlxzInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + for (String re : res){ + if(re.startsWith("租金开票请求成功")){ + return context.success("跳过:" + re); + } + } + }else if ("AddShiChangGenerateQdInvoiceNode".equals(getNodeId()) || "AddShiChangxinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 市场费设置返回值 + String[] res = fhvalue.split(";"); + for (String re : res){ + if(re.startsWith("市场费开票请求成功")){ + return context.success("跳过:" + re); + } + } + }else if ("AddWuYeGenerateQdInvoiceNode".equals(getNodeId())|| "AddWuYexinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 物业费设置返回值 + String[] res = fhvalue.split(";"); + for (String re : res){ + if(re.startsWith("物业费开票请求成功")){ + return context.success("跳过:" + re); + } + } + }else{ + if(fhvalue.startsWith("开票请求成功")) { + return context.success("跳过:" + fhvalue); + } + } +// secretKey + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); +// secretId + String secretId = configVo.getParamVal(HxinvoiceConstants.secretId.name()); +// 请求类型 + String requestType = getRequestType(); +// 接口地址 + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); + String url = ipport+getMethod(); + context.setUrl(url); +// 设置自定义字段 + String dataExchangeId = UUIDLong.longUUID()+""; +// System.out.println("设置开票基础参数"); +// ProtUtil protUtil = new ProtUtil(); + String password =secretKey.substring(0,24); +// 压缩工具类 + GzipUtils gzipUtils = new GzipUtils(); +// 加解密工具类 + TripleDesUtil tripleDesUtil = new TripleDesUtil(); + ParamUtil paramUtil = new ParamUtil(); +// System.out.println("获取参数"); + log.info("处理前参数:"+request); + String contentParam = ""; + if(!"{}".equals(request)){ + contentParam = paramUtil.handleRequestParam(formDataVo,request,getNodeId()); + JSONObject content = JSONObject.parseObject(contentParam); + JSONArray isje = content.getJSONArray("DDZXX"); + if(isje!=null){ + if(isje.size()==0){ + log.info("跳过开票请求成功:当前开票金额为0"); + context.success("跳过开票请求成功:当前开票金额为0" ,false); + return context; + } + }else{ + log.info("跳过开票请求成功:当前开票金额为空"); + context.success("跳过开票请求成功当前开票金额为空" ,false); + return context; + } + } + if(!contentParam.contains("{")){ + context.back("开票请求失败:OA处理异常:" + contentParam); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求失败:OA处理异常:"+contentParam); + return context; + } + context.setRequest(contentParam); + context.setNeedSave(true); + byte[] src = contentParam.getBytes(StandardCharsets.UTF_8); +// 判断是否需要加密 + String encryptCode = "1";//固定为1进行加密 + byte[] bys = {}; + if("1".equals(encryptCode)){ + // 进行加密 + bys = tripleDesUtil.encryptMode(password,src); + } +// 判断是否需要压缩 + String zipCode = "1";//固定为1进行压缩 + byte[] gzis = bys; + if("1".equals(zipCode)){ + // 进行压缩 + gzis = gzipUtils.compress(bys); + } +// System.out.println("加密完成"); +// 进行baes64加密 + String base64Encoded = Base64.encodeBase64URLSafeString(gzis); +// System.out.println("base64Encoded:"+base64Encoded); + log.info("base64Encoded:"+base64Encoded); +// 设置签名参数 + TreeMap treeMap = new TreeMap<>(); + treeMap.put("content",base64Encoded); + treeMap.put("dataExchangeId",dataExchangeId); + treeMap.put("encryptCode",encryptCode); + treeMap.put("secretId",secretId); + treeMap.put("zipCode",zipCode); + StringBuilder contentStr = new StringBuilder(); + + for (String key : treeMap.keySet()) { + contentStr.append(key+"="+treeMap.get(key)+"&"); + } +// System.out.println("准备签名完成"); + String content = contentStr.toString(); + content = content.substring(0,content.length()-1); + String[] urls = url.split("/"); + String uri = urls[0]; + String fuwu = "/" +urls[1]; + String path = "/"+urls[2]+"/"+urls[3]+"/"; + String banben = urls[4]; + String method = "/"+urls[5]; + String srcStr = requestType+uri+fuwu+path+banben+method+"?"+content; +// 进行签名 + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8")); +// 签名转换成字符串 + String signStr = Base64.encodeBase64URLSafeString(signBytes); + log.info("signStr:"+signStr); +// 设置参数 + JSONObject jsonGenerateQdInvoice = new JSONObject(); + jsonGenerateQdInvoice.put("secretId",secretId); + jsonGenerateQdInvoice.put("dataExchangeId",dataExchangeId); + jsonGenerateQdInvoice.put("encryptCode",encryptCode); + jsonGenerateQdInvoice.put("zipCode",zipCode); + jsonGenerateQdInvoice.put("content",base64Encoded); + jsonGenerateQdInvoice.put("signature",signStr); +// System.out.println("准备调用"); +// JSONObject res = protUtil.doPost(jsonGenerateQdInvoice.toString(),"http://"+url); + String response = HxinvoiceHttpUtil.doPost("http://"+url, jsonGenerateQdInvoice.toString()); +// System.out.println(response); + JSONObject resjson = JSON.parseObject(response); +// System.out.println("调用完成"); + String con = resjson.getString("content"); + byte[] decodedBytes = Base64.decodeBase64(con); + String iszipCode = resjson.getString("zipCode"); + String isencryptCode = resjson.getString("encryptCode"); +// 是否需要进行解压 + byte[] dec = decodedBytes; + if("1".equals(iszipCode)){ + dec = gzipUtils.decompress(decodedBytes); + } +// 是否需要进行解密 + byte[] d= dec; + if("1".equals(isencryptCode)){ + d = tripleDesUtil.decryptMode(password,dec); + } + String str = new String(d,"UTF-8"); + context.setResponse(str); + HxinvoiceResponse hxinvoiceResponse = HxinvoiceHttpUtil.parseResponse(str); + if(hxinvoiceResponse.isSuccess()) { +// cap4ReturnUtil.setParamReturn(getNodeId(),hxinvoiceResponse,formDataVo); +// System.out.println("参数处理完成"+hxinvoiceResponse); + log.info(hxinvoiceResponse.getData()); +// System.out.println("推送成功显示"+hxinvoiceResponse.getMsg()); + context.success("开票请求成功:" + hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg(), false); + if("AddGenerateQdBdczlInvoiceNode".equals(getNodeId()) || "AddGenerateQdBdczlxzInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("租金开票请求")){ + for (String re : res){ + if(re.startsWith("租金开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +";租金开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中;" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+";"+re; + } + } + }else{ + dzqsxtfhjg = fhvalue+"租金开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中;"; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else if ("AddShiChangGenerateQdInvoiceNode".equals(getNodeId())||"AddShiChangxinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("市场费开票请求")){ + for (String re : res){ + if(re.startsWith("市场费开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"市场费开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中;" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+";"+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +"市场费开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中;" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else if ("AddWuYeGenerateQdInvoiceNode".equals(getNodeId())||"AddWuYexinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("物业费开票请求")){ + for (String re : res){ + if(re.startsWith("物业费开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"物业费开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中;" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +"物业费开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中;" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else{ + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求成功:"+ hxinvoiceResponse.getData()+hxinvoiceResponse.getMsg()+"开票中"); + } + }else{ + context.setErrMsg(hxinvoiceResponse.getMsg()); + context.setException(true); + context.back("开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()); + if("AddGenerateQdBdczlInvoiceNode".equals(getNodeId())||"AddGenerateQdBdczlxzInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("租金开票请求")){ + for (String re : res){ + if(re.startsWith("租金开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"租金开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()+";" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +"租金开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()+";" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else if ("AddShiChangGenerateQdInvoiceNode".equals(getNodeId()) || "AddShiChangxinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("市场费开票请求")){ + for (String re : res){ + if(re.startsWith("市场费开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"市场费开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()+";" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +"市场费开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()+";" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else if ("AddWuYeGenerateQdInvoiceNode".equals(getNodeId()) || "AddWuYexinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("物业费开票请求")){ + for (String re : res){ + if(re.startsWith("物业费开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"物业费开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()+";" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +";物业费开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()+";" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else{ + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()); + } + } + }catch (Exception e) { +// System.out.println(e.getMessage()); + e.printStackTrace(); + context.setException(true); + context.back("开票请求失败:OA处理异常:" + e.getMessage()); + if("AddGenerateQdBdczlInvoiceNode".equals(getNodeId()) ||"AddGenerateQdBdczlxzInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("租金开票请求")){ + for (String re : res){ + if(re.startsWith("租金开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"租金开票请求失败:" + e.getMessage()+";" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +";租金开票请求失败:" + e.getMessage()+";" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else if ("AddShiChangGenerateQdInvoiceNode".equals(getNodeId())||"AddShiChangxinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("市场费开票请求")){ + for (String re : res){ + if(re.startsWith("市场费开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"市场费开票请求失败:" + e.getMessage()+";" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +";市场费开票请求失败:" + e.getMessage()+";" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else if ("AddWuYeGenerateQdInvoiceNode".equals(getNodeId()) ||"AddWuYexinzengGenerateQdInvoiceNode".equals(getNodeId())){ +// 租金设置返回值 + String[] res = fhvalue.split(";"); + String dzqsxtfhjg = ""; + if(fhvalue.startsWith("物业费开票请求")){ + for (String re : res){ + if(re.startsWith("物业费开票请求")){ + dzqsxtfhjg = dzqsxtfhjg +"物业费开票请求失败:" + e.getMessage()+";" ; + }else{ + dzqsxtfhjg = dzqsxtfhjg+re; + } + } + }else{ + dzqsxtfhjg = fhvalue +";物业费开票请求失败:" + e.getMessage()+";" ; + } + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", dzqsxtfhjg); + }else{ + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求失败:OA处理异常" + e.getMessage()); + } + return context; + } + +// 正常结束进行现成等待10秒后调用定时任务查询发票开票结果 + + return context; + } + + + public abstract String getMethod(); + public abstract String getRequestType(); +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/HxinvoicePluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/HxinvoicePluginApi.java new file mode 100644 index 0000000..73d8810 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/HxinvoicePluginApi.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.src_hxinvoice; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; + +public class HxinvoicePluginApi extends APluginInfoApi { + public HxinvoicePluginApi() { + } + + public String getPluginId() { + System.out.println(HxinvoiceConstants.getPluginId()); + return HxinvoiceConstants.getPluginId(); + } + + public String getCreateUser() { + return "橙阳科技"; + } + + public String getDescription() { + return "航信开票集成管理"; + } + + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + HxinvoiceConstants[] var2 = HxinvoiceConstants.values(); + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + HxinvoiceConstants value = var2[var4]; + if (value != HxinvoiceConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + + return configVo; + } + +// public void registerCustomEvent(Map eventAndNodes) { +// eventAndNodes.put("propertyDispose", "资产管理待办推送"); +// } +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/constants/HxinvoiceConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/constants/HxinvoiceConstants.java new file mode 100644 index 0000000..947b38f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/constants/HxinvoiceConstants.java @@ -0,0 +1,44 @@ +package com.seeyon.apps.src_hxinvoice.constants; + +public enum HxinvoiceConstants { + + + plugin("src_hxinvoice","插件ID"), + secretKey("IGedAOlfMsPotl7WXePNPSNdPtjnvn85Tvt9","secretKey"), + secretId("NfD7rBPYAk1Zod37wqlB4wWdgSFtRgMj","secretId"), + ipport("10.1.10.202:10000","ip端口"), + uploadMemberLoginName("oatest","附件上传人员登录名"), + updateAccountName("湖北三峡旅游集团股份有限公司","上传单位名称"), + stateEnumId("xxxxx","订单状态枚举ID"), + nodeTokenUrl("/seeyon/rest/flow/notification/","超级节点回调URL"), + localipport("http://10.1.10.12","本地ip端口"), + getTokenUrl("/seeyon/rest/token/","调用获取TOKEN地址"), + localRestName("testHR","本地rest名称"), + localRestPwd("5434c7fc-12e6-4d17-97e0-ba1a825757e4","本地rest密码"), + enumProCode("FaPiaoXingXingZhi","发票行性质编码"), + hxInvoicessoIpportUrl("https://itax-test.hbsxly.com","航信单点登录ip端口"), + hxInvoicessoUrl("/itaxAdmin/doLoginSx?un=","航信单点登录url"), + yhzcbsProCode("xxx","优惠政策标识枚举编码"), + lsbsProCode("xxx","零税标识枚举编码"); + + HxinvoiceConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/controller/PushOrderInfoAndInvoiceInfoController.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/controller/PushOrderInfoAndInvoiceInfoController.java new file mode 100644 index 0000000..11d336f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/controller/PushOrderInfoAndInvoiceInfoController.java @@ -0,0 +1,79 @@ +package com.seeyon.apps.src_hxinvoice.controller; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.util.annotation.NeedlessCheckLogin; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.net.URLDecoder; + +public class PushOrderInfoAndInvoiceInfoController extends BaseController { + + private IInvoiceService invoiceServiceImpl; + + public IInvoiceService getInvoiceService() { + if (this.invoiceServiceImpl == null) { + this.invoiceServiceImpl = ((IInvoiceService) AppContext.getBean("invoiceServiceImpl")); + } + return invoiceServiceImpl; + } + public void setInvoiceService(IInvoiceService invoiceServiceImpl) { + this.invoiceServiceImpl = invoiceServiceImpl; + } + + @NeedlessCheckLogin + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception { +// ConfigVo configVo = getYdctLeaseBillConfig(); + // 设置返回值对象 + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + + BufferedReader reader = request.getReader(); + String line; + StringBuilder requestBody = new StringBuilder(); + while((line = reader.readLine())!=null){ + requestBody.append(line); + } + String data = requestBody.toString(); + String decodedParam = URLDecoder.decode(data, "UTF-8"); + String[] datas = decodedParam.split("&"); + JSONObject jsonObject = new JSONObject(); + for(int i = 0 ; i < datas.length ; i ++ ){ + String[] params = datas[i].split("="); + if(params.length>1){ + jsonObject.put(params[0],params[1]); + } + } + JSONObject res = null; + try { +// res = getInvoiceService().PushOrderInfoAndInvoiceInfoService(jsonObject); + res = new JSONObject(); + } catch (Exception e) { + e.printStackTrace(); + } + + render(response, res.toString()); + return null; + } + + /** + * 给前台渲染json数据 + * @param response + * @param text + */ + private void render(HttpServletResponse response, String text) { + response.setContentType("application/json;charset=UTF-8"); + try { + response.setContentLength(text.getBytes("UTF-8").length); + response.getWriter().write(text); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/dao/IHxinvoiceDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/dao/IHxinvoiceDao.java new file mode 100644 index 0000000..a6ab317 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/dao/IHxinvoiceDao.java @@ -0,0 +1,36 @@ +package com.seeyon.apps.src_hxinvoice.dao; + +import java.util.List; +import java.util.Map; + +public interface IHxinvoiceDao { + + public String getInvoiceIdByCode(String code,String shuihao); + + public String getInvoiceDYFlowIdByCode(String code,String shuihao); + + public int updateInvoiceDYFlowByCode(String msg,String code,String shuihao); + + public Map getInvoicePLFlowIdByCode(String code,String shuihao); + + public int updateInvoicePLFlowByCode(String msg,String code,String shuihao); + + public int updateInvoiceByGoodsCode(String formmainId,String goodsCode,String taxAmount); + + public int updateInvoiceDataByNoCode(String formId, Map param); + + public Map getCtpEnumItemsByEnumId (String refEnumId); + + public List> getInvoicesByState(); + + public Map getGoodsByCode(String goodsCode); + +// 查询快捷冲红未开票成功数据 + public List> queryFastRedInvoice(); + +// 根据税目编码查询税率信息 + public List getTaxRateByTaxItemCode (String taxItemCode); + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/dao/impl/HxinvoiceDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/dao/impl/HxinvoiceDaoImpl.java new file mode 100644 index 0000000..4093b2e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/dao/impl/HxinvoiceDaoImpl.java @@ -0,0 +1,404 @@ +package com.seeyon.apps.src_hxinvoice.dao.impl; + +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; +import www.seeyon.com.utils.StringUtil; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class HxinvoiceDaoImpl implements IHxinvoiceDao { +// 测试环境 +// private String getInvoiceIdByCode = "select id from formmain_3963 where field0078 = ? and field0054 = ?"; +// private String getInvoiceDYFlowIdByCode = "select id from formmain_3969 where field0078 = ? and field0054 = ?"; +// private String getInvoicePLFlowIdByCode = "select id from formmain_3972 where field0078 = ? and field0054 = ?"; +// private String updateInvoiceByGoodsCode = "update formson_3964 set field0073 = ? where formmain_id = ? and field0080 = ?"; +// private String updateInvoiceDataByNoCode = "update formmain_3963 set field0050 = ? , field0085 = TO_DATE(?,'YYYY-MM-DD HH24:MI:SS') ,field0086 = ?,field0084 = ?,field0087 = ? ,field0005 = ? where id = ?"; +// private String getCtpEnumItemsByEnumId = "select id,ref_enumid,showvalue,enumvalue from ctp_enum_item where ref_enumid = ?"; +// private String getInvoicesByState = +// "SELECT f1.id,to_char( f1.field0039, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqq,to_char( f1.field0039 + 1, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqz,f1.field0078,f1.field0054,e1.showvalue FROM formmain_3963 f1 LEFT JOIN ctp_enum_item e1 ON f1.field0084 = e1.id WHERE (e1.showvalue != '订单开票成功' and e1.showvalue !='订单开票失败') or e1.showvalue is null"; +// private String getGoodsByCode = "select field0084,field0094,field0093,field0120,field0121 from formmain_3960 where field0083 = ?"; +// private String queryFastRedInvoice = "select field0047,field0059,field0058,field0064,field0057 from formmain_3958 where field0064 not like '%订单开票成功%' or field0064 is null"; +// private String getTaxRateByTaxItemCode = "select field0084,field0094 from formmain_3960 where field0083 = ?"; + +// 正式环境 + private String getInvoiceIdByCode = "select id from formmain_3969 where field0078 = ? and field0054 = ?"; + private String getInvoiceDYFlowIdByCode = "select id from formmain_3967 where field0078 = ? and field0054 = ?"; + private String updateInvoiceDYFlowIdByCode = "update formmain_3967 set field0076 = ? where field0078 = ? and field0054 = ?"; + private String getInvoicePLFlowIdByCode = "select id,field0076 as resdata from formmain_3972 where field0078 = ? and field0115 = ?"; + private String updateInvoicePLFlowByCode = "update formmain_3972 set field0076 = ? where field0078 = ? and field0115 = ?"; + private String updateInvoiceByGoodsCode = "update formson_3970 set field0073 = ? where formmain_id = ? and field0080 = ?"; + private String updateInvoiceDataByNoCode = "update formmain_3969 set field0050 = ? , field0085 = TO_DATE(?,'YYYY-MM-DD HH24:MI:SS') ,field0086 = ?,field0084 = ?,field0087 = ? ,field0005 = ? where id = ?"; + private String getCtpEnumItemsByEnumId = "select id,ref_enumid,showvalue,enumvalue from ctp_enum_item where ref_enumid = ?"; + private String getInvoicesByState = + "SELECT f1.id,to_char( f1.field0039, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqq,to_char( f1.field0039 + 1, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqz,f1.field0078 as ddqqlsh,f1.field0054 as shuihao,e1.showvalue FROM formmain_3969 f1 LEFT JOIN ctp_enum_item e1 ON f1.field0084 = e1.id WHERE (e1.showvalue != '订单开票成功' and e1.showvalue !='订单开票失败') or e1.showvalue is null"; +// "SELECT f1.id,to_char( f1.field0039, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqq,to_char( f1.field0039 + 1, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqz,f1.field0078 as ddqqlsh,f1.field0054 as shuihao,e1.showvalue FROM formmain_3969 f1 LEFT JOIN ctp_enum_item e1 ON f1.field0084 = e1.id "; + private String getGoodsByCode = "select field0084,field0094,field0093,field0120,field0121 from formmain_3966 where field0083 = ?"; + private String queryFastRedInvoice = "select field0047,field0059,field0058,field0064,field0057 from formmain_3982 where field0064 not like '%订单开票成功%' or field0064 is null"; + private String getTaxRateByTaxItemCode = "select field0084,field0094 from formmain_3966 where field0083 = ?"; + +// select id from formmain_3969 where field0078 = ? and field0054 = ? + @Override + public String getInvoiceIdByCode(String code,String shuihao) { + String res = ""; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getInvoiceIdByCode); + List p = new ArrayList(); + p.add(code); + p.add(shuihao); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + res = map.get("id").toString(); + }else{ + res = "0"; + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select id from formmain_3967 where field0078 = ? and field0054 = ? + @Override + public String getInvoiceDYFlowIdByCode(String code,String shuihao) { + String res = ""; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getInvoiceDYFlowIdByCode); + List p = new ArrayList(); + p.add(code); + p.add(shuihao); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + res = map.get("id").toString(); + }else{ + res = "0"; + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// update formmain_3967 set field0076 = ? where field0078 = ? and field0054 = ? + @Override + public int updateInvoiceDYFlowByCode(String msg,String code,String shuihao) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateInvoiceDYFlowIdByCode); + List p = new ArrayList(); + p.add(msg); + p.add(code); + p.add(shuihao); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + // update formmain_3967 set field0076 = ? where field0078 = ? and field0054 = ? + @Override + public int updateInvoicePLFlowByCode(String msg,String code,String shuihao) { + int i = 0; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateInvoicePLFlowByCode); + List p = new ArrayList(); + p.add(msg); + p.add(code); + p.add(shuihao); + i = agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// select id,field0076 as resdata from formmain_3972 where field0078 = ? and field0115 = ? + @Override + public Map getInvoicePLFlowIdByCode(String code,String shuihao) { + Map res = new HashMap<>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getInvoicePLFlowIdByCode); + List p = new ArrayList(); + p.add(code); + p.add(shuihao); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + if (list != null && list.size() > 0) { + Map map = list.get(0); + res.put("id",map.get("id").toString()); + res.put("resdata",map.get("resdata").toString()); + }else{ + res.put("id","0"); + res.put("resdata",""); + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// update formson_3970 set field0073 = ? where formmain_id = ? and field0080 = ? + @Override + public int updateInvoiceByGoodsCode(String formmainId, String goodsCode, String taxAmount) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateInvoiceByGoodsCode); + List p = new ArrayList(); + p.add(taxAmount); + p.add(formmainId); + p.add(goodsCode); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// update formmain_3969 set field0050 = ? , field0085 = TO_DATE(?,'YYYY-MM-DD HH24:MI:SS') ,field0086 = ?,field0084 = ?,field0087 = ? ,field0005 = ? where id = ? + @Override + public int updateInvoiceDataByNoCode(String noCode, Map param) { + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(updateInvoiceDataByNoCode); + List p = new ArrayList(); + p.add(param.get("发票号码")); +// p.add(param.get("发票代码")); + p.add(param.get("实际开票日期")); +// p.add(param.get("订单状态")); + p.add(param.get("订单状态描述")); + p.add(param.get("订单状态")); + p.add(param.get("数电发票附件")); + p.add(param.get("开票事项说明")); + p.add(noCode); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + +// select id,ref_enumid,showvalue,enumvalue from ctp_enum_item where ref_enumid = ? + @Override + public Map getCtpEnumItemsByEnumId(String refEnumId) { + Map res = new HashMap<>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getCtpEnumItemsByEnumId); + List p = new ArrayList(); + p.add(refEnumId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + + for(int i = 0 ; i < list.size() ; i++){ + Map map = list.get(i); + res.put(map.get("showvalue").toString(),map.get("id").toString()); + + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// SELECT f1.id,to_char( f1.field0039, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqq,to_char( f1.field0039 + 1, 'YYYY-MM-DD HH24:MI:SS' ) AS ddrqz,f1.field0078,f1.field0054,e1.showvalue FROM formmain_3969 f1 LEFT JOIN ctp_enum_item e1 ON f1.field0084 = e1.id WHERE (e1.showvalue != '订单开票成功' and e1.showvalue !='订单开票失败') or e1.showvalue is null + @Override + public List> getInvoicesByState() { + List> res = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getInvoicesByState); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List lists = agent.resultSetToList(); + if (lists != null && lists.size() > 0) { + for(int i = 0 ; i < lists.size() ; i ++) { + Map map = new HashMap<>(); + Map list = lists.get(i); + map.put("id",list.get("id")); + map.put("ddqqlsh",list.get("ddqqlsh")); + map.put("shuihao",list.get("shuihao")); +// map.put("dingdan",list.get("field0088")); +// map.put("kaipiaodate",list.get("field0039")); + map.put("ddrqq",list.get("ddrqq")); + map.put("ddrqz",list.get("ddrqz")); + res.add(map); +// System.out.println(map.toString()); + } + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select field0084,field0094,field0093,field0120,field0121 from formmain_3966 where field0083 = ? + @Override + public Map getGoodsByCode(String goodsCode) { + Map res = new HashMap<>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getGoodsByCode); + List p = new ArrayList(); + p.add(goodsCode); + agent.execute(sql.toString(), p); + List lists = agent.resultSetToList(); + if (lists != null && lists.size() > 0) { + Map list = lists.get(0); + res.put("spmc",list.get("field0084")); + res.put("sl",list.get("field0094")); + res.put("lsbs",list.get("field0120")); + res.put("zzstsgl",list.get("field0093")); + res.put("yhzcbs",list.get("field0121")); +// System.out.println(res.toString()); + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select field0047,field0059,field0058,field0064,field0057 from formmain_3982 where field0064 !='订单开票成功' or field0064 is null + @Override + public List> queryFastRedInvoice() { + List> res = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(queryFastRedInvoice); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List lists = agent.resultSetToList(); + if (lists != null && lists.size() > 0) { + for(int i = 0 ; i < lists.size() ; i ++) { + Map map = new HashMap<>(); + Map list = lists.get(i); + map.put("uuid",list.get("field0059")); + map.put("hzfpxxqrdbh",list.get("field0058")); + map.put("nsrsbh",list.get("field0047")); + map.put("token",list.get("field0057")); + res.add(map); +// System.out.println(map.toString()); + } + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + +// select field0084,field0094 from formmain_3966 where field0083 = ? + @Override + public List getTaxRateByTaxItemCode(String taxItemCode) { + List res = new ArrayList<>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getTaxRateByTaxItemCode); + List p = new ArrayList(); + p.add(taxItemCode); + agent.execute(sql.toString(), p); + List lists = agent.resultSetToList(); + if (lists != null && lists.size() > 0) { + for(int i = 0 ; i < lists.size() ; i ++) { + String taxRate = "0"; + Map list = lists.get(i); + if(list.get("field0094")!=null){ + taxRate = list.get("field0094").toString(); + } + res.add(taxRate); + } + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + return res; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/event/FileDataValidateBeforeStartEvent.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/event/FileDataValidateBeforeStartEvent.java new file mode 100644 index 0000000..4a495bd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/event/FileDataValidateBeforeStartEvent.java @@ -0,0 +1,135 @@ +package com.seeyon.apps.src_hxinvoice.event; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.event.ACommonWorkflowEvent; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.WorkflowEventContext; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.dao.impl.HxinvoiceDaoImpl; +import com.seeyon.apps.src_hxinvoice.util.FileUtil; +import com.seeyon.apps.src_hxinvoice.util.FourDigitUniqueIdGenerator; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import www.seeyon.com.utils.StringUtil; + +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class FileDataValidateBeforeStartEvent extends ACommonWorkflowEvent { + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + + @Override + protected WorkflowEventContext proceed(String request, FormDataVo formDataVo, WorkFlowType workFlowType, FormDataMasterBean formDataMasterBean) throws Exception { + WorkflowEventContext context = new WorkflowEventContext(); + + ConfigVo configVo = cstConfigApi.getConfig(getPluginId()); + NumberFormat nf = NumberFormat.getNumberInstance(); + nf.setMaximumFractionDigits(2); // 保留2位 + nf.setRoundingMode(RoundingMode.HALF_UP); // 四舍五入 + nf.setGroupingUsed(false); + context.setNeedSave(true); + + System.out.println("进行附件处理"); + FileUtil fileUtil = new FileUtil(); + IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); +// 参数转JSON + JSONObject jsonObject = JSONObject.parseObject(request); +// 获取参数名称 + String DDZXXName = jsonObject.getString("DDZXX"); + System.out.println("获取参数附件ID"+DDZXXName); +// 根据参数名称获取附件控件对象 +// 设置附件下载路径 + String path = SystemEnvironment.getApplicationFolder()+"/hxinvoiceFile/"+DDZXXName+"/"; + System.out.println("文件下载路径"+path); + Thread.sleep(3000); +// 将附件下载到服务器 + List filePaths = fileUtil.fieldFileDownload(Long.parseLong(DDZXXName),path); +// 创建DDZXX对象 + JSONArray DDZXXS = new JSONArray(); + +// 税率判断 + String taxRes = ""; + double zje = 0; + double sj = 0; + double bhsje = 0; + for(String filePath : filePaths){ + JSONArray jsonArray = fileUtil.getFileContent(filePath); +// System.out.println("获取附件内容"+jsonArray); + for(int i = 0 ; i < jsonArray.size();i++){ + JSONObject fileJson = jsonArray.getJSONObject(i); + JSONArray SPS = fileJson.getJSONArray("SPS"); + for (int n = 0 ; n < SPS.size() ; n++){ + JSONObject SP = SPS.getJSONObject(n); + String SPBM = SP.getString("SPBM"); + String XMMC = SP.getString("XMMC"); + String SL = SP.getString("SL"); + List taxRates = hxinvoiceDao.getTaxRateByTaxItemCode(SPBM); + if(!taxRates.contains(SL)){ + taxRes = taxRes+SPBM+XMMC+"、"; + } + String JE = SP.getString("JE"); + zje = zje +Double.parseDouble(JE); + sj = sj+(Double.parseDouble(JE)*Double.parseDouble(SL)); + } + } + } + if(taxRes.length()==0){ + context.setSuccess(true); + context.setErrMsg("税率校验成功。发起流程"); + }else{ + taxRes = taxRes.substring(0,taxRes.length()-1)+"税目编码与税率不匹配"; + context.setSuccess(false); + context.setErrMsg(taxRes); + } +// 总金额=金额累计和 +// 税金 = (金额*税率)累计和 +// 不含税金额 = 总金额 - 税金 + System.out.println("总金额"+nf.format(zje)); + System.out.println("税金"+nf.format(sj)); + System.out.println("不含税金额"+nf.format(zje-sj)); + + formDataVo.getNewFieldDataMap().put("总金额合计", nf.format(zje)); + formDataVo.getNewFieldDataMap().put("税金合计", nf.format(sj)); + formDataVo.getNewFieldDataMap().put("不含税金额合计", nf.format(zje-sj)); + + return context; + } + + @Override + public String getPluginId() { + return HxinvoiceConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] { WorkFlowType.onBeforeStart }; + } + + @Override + public String getId() { + return "FileDataValidateBeforeStartEvent"; + } + + @Override + public String getLabel() { + return "批量数电发票开票附件校验发起前监听"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/fieldCtrl/TttttttFieldCtrl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/fieldCtrl/TttttttFieldCtrl.java new file mode 100644 index 0000000..cfabc71 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/fieldCtrl/TttttttFieldCtrl.java @@ -0,0 +1,97 @@ +package com.seeyon.apps.src_hxinvoice.fieldCtrl; + +import com.seeyon.cap4.form.bean.ParamDefinition; +import com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl; +import com.seeyon.cap4.form.util.Enums.ParamType; +import www.seeyon.com.utils.UUIDUtil; + +import java.util.List; + +/** + *
+ * 自定义控件:调用接口
+ * 
+ */ +public class TttttttFieldCtrl extends FormFieldCustomCtrl { + + /** + * UUIDLong.longUUID() + * UUIDUtil.getUUIDString() + */ + public String getKey() { + return "8561216149315062128"; + } + + public static void main(String[] args) { + System.out.println(UUIDUtil.getUUIDLong()); + } + + public String getFieldLength() { + return "20"; + } + + /** + * 控件初始化接口,此接口在控件初始化的时候,会调用,主要用于定义控件所属插件id、在表单编辑器中的图标、表单编辑器中有哪些属性可以设置。 + * 使用举例:在接口中定义自定义控件在在表单编辑器中有哪些控件属性需要配置 + */ + public void init() { + setPluginId("filedatattttttt"); + setIcon("cap-icon-filedatattttttt"); + // 自定义参数 + ParamDefinition templateIdParam = new ParamDefinition(); + templateIdParam.setParamType(ParamType.button); + addDefinition(templateIdParam); + } + + /** (non-Javadoc) + * @see FormFieldCustomCtrl#getPCInjectionInfo() + * PC端的资源文件路径 + */ + public String getPCInjectionInfo() { + return "{path:'apps_res/cap/customCtrlResources/ordinaryResources/',jsUri:'js/openUnflow.js',initMethod:'init',nameSpace:'field_" + getKey() + "'}"; + } + + + /** + * 获取移动端自定义控件运行态资源注入信息 + * path:'http://'+m3应用包mainifest.json中的urlSchemes的值+'v'+m3应用包mainifest.json中的version的值 + * weixinpath: 微信端打开的时候使用的m3/apps/v5/自定义控件移动端资源目录名称/,weixinpath配置的就是此自定义控件移动端资源目录名称 + * jsUri:移动端表单运行态加载第三方JavaScript的路径 + * initMethod:定义M3端表单运行态第三方js入口方法名称 + * * nameSpace:定义M3端表单运行态命名空间 + * + * @return + */ + + /** (non-Javadoc) + * @see FormFieldCustomCtrl#getMBInjectionInfo() + * 移动端的资源地址 + */ + public String getMBInjectionInfo() { + return "{path:'http://newwidget.v5.cmp/v1.0.0/',weixinpath:'ordinary',jsUri:'js/ordinarym3.js',initMethod:'init',nameSpace:'field_" + this.getKey() + "'}"; + } + + public String getText() { + return "待开票文件校验按钮"; + } + + public boolean canBathUpdate() { + return false; + } + + public List getListShowDefaultVal(Integer externalType) { + return null; + } + + /** + * 初始值生成接口 + */ + public String[] getDefaultVal(String defaultValue) { + return new String[0]; + } + + public boolean canInjectionWord() { + return false; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdBdczlInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdBdczlInvoiceNode.java new file mode 100644 index 0000000..9e5e2e8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdBdczlInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddDanYiGenerateQdBdczlInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdBdczlInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddDanYiGenerateQdBdczlInvoiceNode"; + } + + @Override + public String getNodeName() { + return "单一租赁数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdInvoiceNode.java new file mode 100644 index 0000000..8ab66c0 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddDanYiGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddDanYiGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "单一数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdlkysfwInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdlkysfwInvoiceNode.java new file mode 100644 index 0000000..3ab1ec4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiGenerateQdlkysfwInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddDanYiGenerateQdlkysfwInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdlkysfwInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddDanYiGenerateQdlkysfwInvoiceNode"; + } + + @Override + public String getNodeName() { + return "单一旅客运输数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiParkingFeeGenerateQdBdczlInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiParkingFeeGenerateQdBdczlInvoiceNode.java new file mode 100644 index 0000000..bb6c5f6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddDanYiParkingFeeGenerateQdBdczlInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddDanYiParkingFeeGenerateQdBdczlInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdBdczlInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddDanYiParkingFeeGenerateQdBdczlInvoiceNode"; + } + + @Override + public String getNodeName() { + return "单一停车费租赁数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdBdczlInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdBdczlInvoiceNode.java new file mode 100644 index 0000000..46fc041 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdBdczlInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddGenerateQdBdczlInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdBdczlInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddGenerateQdBdczlInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电不动产租赁租金开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdBdczlxzInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdBdczlxzInvoiceNode.java new file mode 100644 index 0000000..8fbb446 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdBdczlxzInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddGenerateQdBdczlxzInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdBdczlInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddGenerateQdBdczlxzInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电不动产租赁合同签订租金开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdHwysInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdHwysInvoiceNode.java new file mode 100644 index 0000000..0f17119 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdHwysInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddGenerateQdHwysInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdHwysInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddGenerateQdHwysInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电货物运输发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdInvoiceArchivesNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdInvoiceArchivesNode.java new file mode 100644 index 0000000..5239741 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdInvoiceArchivesNode.java @@ -0,0 +1,324 @@ +package com.seeyon.apps.src_hxinvoice.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.dao.impl.HxinvoiceDaoImpl; +import com.seeyon.apps.src_hxinvoice.util.FileUtil; +import com.seeyon.apps.src_hxinvoice.util.FormExportUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import www.seeyon.com.utils.StringUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class AddGenerateQdInvoiceArchivesNode extends ACommonSuperNode { + + private static Log log = Log.get(AddGenerateQdInvoiceArchivesNode.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + public ConfigVo getHxinvoiceConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManager() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew; } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");}return enumManagerNew; + } + + private FormFactory formFactory; + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + private OrgManager orgManager; + + public OrgManager getOrgManager() { + if (this.orgManager == null) { + this.orgManager = ((OrgManager)AppContext.getBean("orgManager")); + } + return orgManager; + } + + public void setOrgManager(OrgManager orgManager) { + this.orgManager = orgManager; + } + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + @Override + public String getPluginId() { + return HxinvoiceConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[0]; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + System.out.println("进入开票档案表创建超级节点"); + SuperNodeContext context = new SuperNodeContext(); + try{ + IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); + ConfigVo configVo = getHxinvoiceConfig(); + FileUtil fileUtil = new FileUtil(); + FormExportUtil formExportUtil = new FormExportUtil(); +// 根据附件ID获取文件信息 + JSONObject jsonObject = JSONObject.parseObject(request); + String fileIdStr = jsonObject.getString("fileId"); +// 查询附件路径,解析附件文件 + JSONArray jsonArray = fileUtil.getFileContent(Long.parseLong(fileIdStr)); + context.setRequest(jsonArray.toString()); + context.setNeedSave(true); +// 主表通用字段 + FieldDataVo ddqqpchvo = formDataVo.getFieldData("订单请求批次号"); + String ddqqpcl = ddqqpchvo.getStringValue(); + FieldDataVo jbbmvo = formDataVo.getFieldData("经办部门"); +// String jbbm = jbbmvo.getStringValue(); + String jbbm = ""; + String jbbmid = ""; + if(jbbmvo.getDbValue()!=null){ + String jbbmdb = jbbmvo.getDbValue().toString(); + V3xOrgDepartment v3xOrgDepartment = orgManager.getDepartmentById(Long.parseLong(jbbmdb)); + jbbm = v3xOrgDepartment.getName(); + jbbmid = v3xOrgDepartment.getId()+""; + } + + FieldDataVo jbryvo = formDataVo.getFieldData("经办人员"); + String jbry = ""; + String jbryid = ""; + if(jbryvo.getDbValue()!=null){ + String jbrydb = jbryvo.getDbValue().toString(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(jbrydb)); + jbry = v3xOrgMember.getName(); + jbryid = v3xOrgMember.getId()+""; + } + FieldDataVo jbrqvo = formDataVo.getFieldData("经办日期"); + String jbrq = jbrqvo.getStringValue(); + FieldDataVo fqlxvo = formDataVo.getFieldData("发票类型"); + Object fqlx = fqlxvo.getDbValue(); + FieldDataVo xtlyvo = formDataVo.getFieldData("系统来源标识"); + String txly = xtlyvo.getStringValue(); + FieldDataVo kqlxvo = formDataVo.getFieldData("红蓝开票类型"); + Object kqlx = kqlxvo.getDbValue(); + FieldDataVo fqlxdmvo = formDataVo.getFieldData("发票类型代码"); + String fqlxdm = fqlxdmvo.getStringValue(); + FieldDataVo kjfpzlvo = formDataVo.getFieldData("开具发票种类"); + Object kjfpzl = kjfpzlvo.getDbValue(); + FieldDataVo dzqsxtfhjgvo = formDataVo.getFieldData("电子税票系统返回结果"); + String dzqsxtfhjg = dzqsxtfhjgvo.getStringValue(); + FieldDataVo kqryvo = formDataVo.getFieldData("开票人"); + String kqry = kqryvo.getStringValue(); + FieldDataVo kqrqvo = formDataVo.getFieldData("开票日期"); + String kqrq = kqrqvo.getStringValue(); + FieldDataVo kqdjhvo = formDataVo.getFieldData("开票单据号"); + String kqdjh = kqdjhvo.getStringValue(); + FieldDataVo gsmcvo = formDataVo.getFieldData("公司名称"); + String gsmc = gsmcvo.getStringValue(); + FieldDataVo gsbhvo = formDataVo.getFieldData("公司编号"); + String gsbh = gsbhvo.getStringValue(); + FieldDataVo ddqqlshvo = formDataVo.getFieldData("订单请求流水号"); + String ddqqlsh = ddqqlshvo.getStringValue(); + FieldDataVo shxmcvo = formDataVo.getFieldData("公司名称"); + String shxmc = shxmcvo.getStringValue(); + FieldDataVo xhfnsrsbhvo = formDataVo.getFieldData("销售方税号"); + String xhfnsrsbh = xhfnsrsbhvo.getStringValue(); +// 根据文件信息创建创建档案表参数 + for(int i = 0 ; i < jsonArray.size() ; i++){ + FormExport formExport = new FormExport(); + JSONObject paramjson = jsonArray.getJSONObject(i); + log.info(paramjson.toString()); +// System.out.println(paramjson.toString()); +// 设置主表数据 + Map map = new HashMap<>(); + map.put("订单请求批次号",ddqqpcl); + map.put("订单请求流水号",ddqqlsh+"_"+paramjson.getString("DDH")); + map.put("订单号",kqdjh); + map.put("开票单据号",kqdjh); + map.put("公司名称",gsmc); + map.put("公司编号",gsbh); + map.put("经办部门",jbbmid); + map.put("经办人员",jbryid); + map.put("经办日期",jbrq); + map.put("销售方编号",xhfnsrsbh); + map.put("销售方名称",shxmc); + map.put("销售方纳税人识别号",xhfnsrsbh); + map.put("购买方编号",paramjson.getString("GMFNSRSBH")); + map.put("购买方信息",paramjson.getString("GMFMC")); +// map.put("购买方类型",paramjson.getString("XHFNSRSBH")); + map.put("购买方税号",paramjson.getString("GMFNSRSBH")); + map.put("购买方联系方式",paramjson.getString("GMFSJ")); + map.put("购买方邮箱地址",paramjson.getString("GMFYX")); + map.put("发票类型",fqlx); + map.put("系统来源标识",txly); + map.put("开票类型",kqlx); + map.put("开具发票种类",kjfpzl); + map.put("申请开票日期",kqrq); + map.put("开票人",kqry); + map.put("发票类型代码",fqlxdm); + map.put("电子税票系统返回结果",dzqsxtfhjg); + context.setResponse(map.toString()); + +// 设置明细表数据 + JSONArray sps = paramjson.getJSONArray("SPS"); + List> subMaps = new ArrayList<>(); +// 总金额 + double zje = 0; + for(int n = 0 ; n spmap = new HashMap<>(); + JSONObject sp = sps.getJSONObject(n); + String spcode = sp.get("SPBM").toString(); + Map goods = hxinvoiceDao.getGoodsByCode(spcode); + spmap.put("商品税目分类编码",spcode); + spmap.put("税目编码",spcode); + spmap.put("项目名称",goods.get("spmc")); + if("折扣行".equals(sp.getString("FXHXZ"))){ + spmap.put("发票行性质编码","1");//发票行性质 + }else if ("被折扣行".equals(sp.getString("FXHXZ"))){ + spmap.put("发票行性质编码","2");//发票行性质 + }else{ + spmap.put("发票行性质编码","0");//发票行性质 + } +// Map fxhxzMap = hxinvoiceDao.getGoodsByCode(spcode); + String enumProCode = configVo.getParamVal(HxinvoiceConstants.enumProCode.name()); + CtpEnumBean fxhxzEnum = enumManagerNew.getEnumByProCode(enumProCode); + List fxhxzEnumItems = enumManagerNew.getCtpEnumItem(fxhxzEnum.getId(),0); + + for (CtpEnumItem fxhxzEnumItem:fxhxzEnumItems) { + if(fxhxzEnumItem.getShowvalue().equals(sp.getString("FXHXZ"))){ + spmap.put("发票行性质",fxhxzEnumItem.getId()); + } + } + spmap.put("单位",sp.getString("DW")); + spmap.put("数量",sp.getString("NUM")); + spmap.put("单价",sp.getString("SPDJ")); + spmap.put("项目名称",sp.getString("XMMC")); + spmap.put("商品税目名称",goods.get("spmc"));//商品税目名称 + spmap.put("规格",sp.getString("GGXH"));//商品税目名称 + spmap.put("金额",sp.getString("JE")); + if(StringUtil.isNotEmpty(sp.getString("JE"))){ + zje = zje+Double.parseDouble(sp.getString("JE")); + } + spmap.put("折扣金额",sp.getString("ZKJE")); +// if(!(goods.get("lsbs") == null)){ +// String lsbs = goods.get("lsbs").toString(); +// CtpEnumItem lsbsEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(lsbs)); +// String lsbsstr = lsbsEnum.getValue(); +// spmap.put("零税率标识",lsbsstr);//零税标识 +// } +// if(!(goods.get("yhzcbs") == null)){ +// String yhzcbs = goods.get("yhzcbs").toString(); +// CtpEnumItem yhzcbsEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(yhzcbs)); +// String yhzcbsstr = yhzcbsEnum.getValue(); +// spmap.put("优惠政策标识",yhzcbsstr);//优惠政策标识 +// } + if(StringUtil.isNotEmpty(sp.getString("ZZSTSGL"))){ + spmap.put("增值税特殊管理","免税");//增值税特殊管理 + String yhzcbsProCode = configVo.getParamVal(HxinvoiceConstants.yhzcbsProCode.name()); + CtpEnumBean yhzcbsEnum = enumManagerNew.getEnumByProCode(yhzcbsProCode); + List yhzcbsItems = enumManagerNew.getCtpEnumItem(yhzcbsEnum.getId(),0); + String yhzcbsstr = ""; + for (CtpEnumItem yhzcbsItem:yhzcbsItems) { + if("免税".equals(yhzcbsItem.getShowvalue())){ + yhzcbsstr = yhzcbsItem.getId().toString(); + } + } + spmap.put("优惠政策标识",yhzcbsstr);//优惠政策标识 + String lsbsProCode = configVo.getParamVal(HxinvoiceConstants.lsbsProCode.name()); + CtpEnumBean lsbsEnum = enumManagerNew.getEnumByProCode(lsbsProCode); + List lsbsItems = enumManagerNew.getCtpEnumItem(lsbsEnum.getId(),0); + String lsbsstr = ""; + for (CtpEnumItem lsbsItem:lsbsItems) { + if("零税率".equals(lsbsItem.getShowvalue())){ + lsbsstr = lsbsItem.getId().toString(); + } + } + spmap.put("零税率标识",lsbsstr);//零税标识 + } + String sl = sp.getString("SL"); + spmap.put("税率",sl);//税率 + subMaps.add(spmap); + } + map.put("合计金额",zje); + List valueExports = formExportUtil.setFormValue(map); + List subordinateFormExports = formExportUtil.setSubordinateFormValue(subMaps); + formExport.setValues(valueExports); + formExport.setSubordinateForms(subordinateFormExports); + log.info("准备创建开票档案表"); + String loginName = configVo.getParamVal(HxinvoiceConstants.uploadMemberLoginName.name()); + getFormFactory().importBusinessFormData(loginName, "KPSJDA",formExport, new String[] {}); + } + context.success("档案表创建完成!!!", false); + }catch (Exception e){ + e.printStackTrace(); + context.setResponse(e.toString()); + context.setException(true); + context.back("档案表创建失败!!!"); + } +// 封装档案表参数 +// 使用档案表创建方法生成档案表 + + return context; + } + + @Override + public String getNodeId() { + return "AddGenerateQdInvoiceArchivesNode"; + } + + @Override + public String getNodeName() { + return "批量数电发票开票档案表创建"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdInvoiceNode.java new file mode 100644 index 0000000..1cebbd2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "批量数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdcpyInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdcpyInvoiceNode.java new file mode 100644 index 0000000..4c66fc9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddGenerateQdcpyInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddGenerateQdcpyInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdcpyInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddGenerateQdcpyInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电成品油发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddOrderToFastRedInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddOrderToFastRedInvoiceNode.java new file mode 100644 index 0000000..05d0d61 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddOrderToFastRedInvoiceNode.java @@ -0,0 +1,250 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.util.*; +import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse; +import com.seeyon.cap4.form.api.FormDataApi4Cap4; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.util.UUIDLong; +import com.seeyon.ctp.util.json.JSONUtil; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.TreeMap; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddOrderToFastRedInvoiceNode extends ACommonSuperNode { + + private static Log log = Log.get(AddOrderToFastRedInvoiceNode.class); + + public String getMethod() { + return "/sims-api/invoice/api/v6/OrderToFastRedInvoice"; + } + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "AddOrderToFastRedInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电订单快捷冲红接口"; + } + + public ConfigVo getHxinvoiceConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public String getPluginId() { + return HxinvoiceConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + protected FormDataApi4Cap4 formDataApi4Cap4; + + public void setFormDataApi4Cap4(FormDataApi4Cap4 formDataApi4Cap4) { + this.formDataApi4Cap4 = formDataApi4Cap4; + } + + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + ConfigVo configVo = getHxinvoiceConfig(); + SuperNodeContext context = new SuperNodeContext(); + FieldDataVo fhjg = formDataVo.getFieldData("电子税票系统返回结果"); + String fhvalue = fhjg.getStringValue(); + try { + if(fhvalue.startsWith("冲红请求成功")) { + return context.wait("跳过:" + fhvalue); + } + FieldDataVo hzqrdidvo = formDataVo.getFieldData("红字确认单ID"); + String hzqrdid = hzqrdidvo.getStringValue(); + if(StringUtils.isNotEmpty(hzqrdid)){ + return context.wait("等待确定处理:正在开具当前红字发票请等待开票完成,"+fhvalue); + } +// secretKey + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); +// secretId + String secretId = configVo.getParamVal(HxinvoiceConstants.secretId.name()); +// 请求类型 + String requestType = "POST"; +// 接口地址 + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); +// 获取冲红接口地址 + String url = ipport+getMethod(); + context.setUrl(url); +// 设置自定义字段 + String dataExchangeId = UUIDLong.longUUID()+""; + log.info("设置冲红基础参数"); +// System.out.println("设置冲红基础参数"); +// ProtUtil protUtil = new ProtUtil(); + String password =secretKey.substring(0,24); +// 压缩工具类 + GzipUtils gzipUtils = new GzipUtils(); +// 加解密工具类 + TripleDesUtil tripleDesUtil = new TripleDesUtil(); + ParamUtil paramUtil = new ParamUtil(); +// System.out.println("获取参数"); + log.info("处理前参数:"+request); + String contentParam =""; + if(!"{}".equals(request)){ + contentParam = paramUtil.handleRequestParam(formDataVo,request,getNodeId()); + }else{ + context.back("冲红请求失败:OA处理异常:参数处理异常"); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "冲红请求失败:OA处理异常:参数处理异常"); + return context; + } + if(!contentParam.contains("{")){ + context.back("冲红请求失败:OA处理异常:" + contentParam); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "冲红请求失败:OA处理异常:"+contentParam); + return context; + } + context.setRequest(contentParam); + context.setNeedSave(true); + byte[] src = contentParam.getBytes(StandardCharsets.UTF_8); +// 判断是否需要加密 + String encryptCode = "1";//固定为1进行加密 + byte[] bys = {}; + if("1".equals(encryptCode)){ + // 进行加密 + bys = tripleDesUtil.encryptMode(password,src); + } +// 判断是否需要压缩 + String zipCode = "1";//固定为1进行压缩 + byte[] gzis = bys; + if("1".equals(zipCode)){ + // 进行压缩 + gzis = gzipUtils.compress(bys); + } +// System.out.println("加密完成"); +// 进行baes64加密 + String base64Encoded = Base64.encodeBase64URLSafeString(gzis); +// System.out.println("base64Encoded:"+base64Encoded); +// 设置签名参数 + TreeMap treeMap = new TreeMap<>(); + treeMap.put("content",base64Encoded); + treeMap.put("dataExchangeId",dataExchangeId); + treeMap.put("encryptCode",encryptCode); + treeMap.put("secretId",secretId); + treeMap.put("zipCode",zipCode); + StringBuilder contentStr = new StringBuilder(); + + for (String key : treeMap.keySet()) { + contentStr.append(key+"="+treeMap.get(key)+"&"); + } +// System.out.println("准备签名完成"); + String content = contentStr.toString(); + content = content.substring(0,content.length()-1); + String[] urls = url.split("/"); + String uri = urls[0]; + String fuwu = "/" +urls[1]; + String path = "/"+urls[2]+"/"+urls[3]+"/"; + String banben = urls[4]; + String method = "/"+urls[5]; + String srcStr = requestType+uri+fuwu+path+banben+method+"?"+content; +// 进行签名 + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8")); +// 签名转换成字符串 + String signStr = Base64.encodeBase64URLSafeString(signBytes); +// System.out.println("signStr:"+signStr); +// 设置参数 + JSONObject jsonGenerateQdInvoice = new JSONObject(); + jsonGenerateQdInvoice.put("secretId",secretId); + jsonGenerateQdInvoice.put("dataExchangeId",dataExchangeId); + jsonGenerateQdInvoice.put("encryptCode",encryptCode); + jsonGenerateQdInvoice.put("zipCode",zipCode); + jsonGenerateQdInvoice.put("content",base64Encoded); + jsonGenerateQdInvoice.put("signature",signStr); +// System.out.println("准备调用"); +// JSONObject res = protUtil.doPost(jsonGenerateQdInvoice.toString(),"http://"+url); + String response = HxinvoiceHttpUtil.doPost("http://"+url, jsonGenerateQdInvoice.toString()); +// System.out.println(response); + JSONObject resjson = JSON.parseObject(response); +// System.out.println("调用完成"); + String con = resjson.getString("content"); + byte[] decodedBytes = Base64.decodeBase64(con); + String iszipCode = resjson.getString("zipCode"); + String isencryptCode = resjson.getString("encryptCode"); +// 是否需要进行解压 + byte[] dec = decodedBytes; + if("1".equals(iszipCode)){ + dec = gzipUtils.decompress(decodedBytes); + } +// 是否需要进行解密 + byte[] d= dec; + if("1".equals(isencryptCode)){ + d = tripleDesUtil.decryptMode(password,dec); + } + String str = new String(d,"UTF-8"); + context.setResponse(str); + JSONObject object = JSONUtil.parseJSONString(str, JSONObject.class); + HxinvoiceResponse hxinvoiceResponse = new HxinvoiceResponse(object,getMethod()); + + if(hxinvoiceResponse.isSuccess()) { + JSONObject ret = JSONObject.parseObject(str); + log.info(hxinvoiceResponse.getData()); + log.info("推送成功显示"+hxinvoiceResponse.getMsg()); + context.wait("开票请求成功:" +hxinvoiceResponse.getMsg(), false); + formDataVo.getNewFieldDataMap().put("红字确认单编号", ret.getString("HZFPXXQRDBH")); + formDataVo.getNewFieldDataMap().put("红字确认单ID", ret.getString("UUID")); + formDataVo.getNewFieldDataMap().put("token", formDataVo.getToken()); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求成功:"+hxinvoiceResponse.getMsg()); + formDataVo.getNewFieldDataMap().put("订单状态描述", "开票请求成功:"+hxinvoiceResponse.getMsg()); + }else{ + context.setErrMsg(hxinvoiceResponse.getMsg()); + context.setException(true); + context.back("开票请求失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()); + formDataVo.getNewFieldDataMap().put("token", formDataVo.getToken()); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求失败:" +hxinvoiceResponse.getMsg()); + formDataVo.getNewFieldDataMap().put("订单状态描述", "开票请求失败:" +hxinvoiceResponse.getMsg()); + } + }catch (Exception e) { +// System.out.println(e.getMessage()); + e.printStackTrace(); + context.setException(true); + context.back("开票请求失败:OA处理异常:" + e.getMessage()); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", "开票请求失败:OA处理异常" + e.getMessage()); + formDataVo.getNewFieldDataMap().put("订单状态描述", "开票请求失败:OA处理异常" + e.getMessage()); + return context; + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdBdczlInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdBdczlInvoiceNode.java new file mode 100644 index 0000000..e2b534b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdBdczlInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddReopenGenerateQdBdczlInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdBdczlInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddReopenGenerateQdBdczlInvoiceNode"; + } + + @Override + public String getNodeName() { + return "重开数电租赁发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdHwysInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdHwysInvoiceNode.java new file mode 100644 index 0000000..5b3106e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdHwysInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddReopenGenerateQdHwysInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdHwysInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddReopenGenerateQdHwysInvoiceNode"; + } + + @Override + public String getNodeName() { + return "重开数电货物运输发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdInvoiceNode.java new file mode 100644 index 0000000..a0a6f9e --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddReopenGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddReopenGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "重开数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdcpyInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdcpyInvoiceNode.java new file mode 100644 index 0000000..b964c7b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdcpyInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddReopenGenerateQdcpyInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdcpyInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddReopenGenerateQdcpyInvoiceNode"; + } + + @Override + public String getNodeName() { + return "重开成品油数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdlkysfwInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdlkysfwInvoiceNode.java new file mode 100644 index 0000000..dbf7e33 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenGenerateQdlkysfwInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddReopenGenerateQdlkysfwInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdlkysfwInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddReopenGenerateQdlkysfwInvoiceNode"; + } + + @Override + public String getNodeName() { + return "重开数电旅客运输发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenParkingFeeGenerateQdBdczlInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenParkingFeeGenerateQdBdczlInvoiceNode.java new file mode 100644 index 0000000..b56e0c7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddReopenParkingFeeGenerateQdBdczlInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddReopenParkingFeeGenerateQdBdczlInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdBdczlInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddReopenParkingFeeGenerateQdBdczlInvoiceNode"; + } + + @Override + public String getNodeName() { + return "重开数电停车费租赁数电发票开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddShiChangGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddShiChangGenerateQdInvoiceNode.java new file mode 100644 index 0000000..6c1da25 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddShiChangGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddShiChangGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddShiChangGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电不动产租赁市场费开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddShiChangxinzengGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddShiChangxinzengGenerateQdInvoiceNode.java new file mode 100644 index 0000000..37b747b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddShiChangxinzengGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddShiChangxinzengGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddShiChangxinzengGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电不动产租赁合同签订市场费开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddWuYeGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddWuYeGenerateQdInvoiceNode.java new file mode 100644 index 0000000..898cae7 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddWuYeGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddWuYeGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddWuYeGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电不动产租赁物业费开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddWuYexinzengGenerateQdInvoiceNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddWuYexinzengGenerateQdInvoiceNode.java new file mode 100644 index 0000000..eaff44c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/AddWuYexinzengGenerateQdInvoiceNode.java @@ -0,0 +1,38 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import com.seeyon.apps.src_hxinvoice.HxinvoiceCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class AddWuYexinzengGenerateQdInvoiceNode extends HxinvoiceCommonNode { + + @Override + public String getMethod() { + return "/sims-api/invoice/api/v6/GenerateQdInvoice"; + } + + @Override + public String getRequestType() { + return "POST"; + } + + @Override + public String getNodeId() { + return "AddWuYexinzengGenerateQdInvoiceNode"; + } + + @Override + public String getNodeName() { + return "数电不动产租赁合同签订物业费开票接口"; + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/FileDataValidateNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/FileDataValidateNode.java new file mode 100644 index 0000000..65679da --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/FileDataValidateNode.java @@ -0,0 +1,153 @@ +package com.seeyon.apps.src_hxinvoice.node; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.dao.impl.HxinvoiceDaoImpl; +import com.seeyon.apps.src_hxinvoice.util.FileUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; + +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; + +public class FileDataValidateNode extends ACommonSuperNode { + + private static Log log = Log.get(FileDataValidateNode.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getPluginId() { + return HxinvoiceConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[0]; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + SuperNodeContext context = new SuperNodeContext(); + + ConfigVo configVo = cstConfigApi.getConfig(getPluginId()); + NumberFormat nf = NumberFormat.getNumberInstance(); + nf.setMaximumFractionDigits(2); // 保留2位 + nf.setRoundingMode(RoundingMode.HALF_UP); // 四舍五入 + nf.setGroupingUsed(false); + context.setRequest(request); + context.setNeedSave(true); + + System.out.println("进行附件处理"); + FileUtil fileUtil = new FileUtil(); + IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); +// 参数转JSON + JSONObject jsonObject = JSONObject.parseObject(request); +// 获取参数名称 + String DDZXXName = jsonObject.getString("DDZXX"); + System.out.println("获取参数附件ID"+DDZXXName); +// 根据参数名称获取附件控件对象 +// 设置附件下载路径 + String path = SystemEnvironment.getApplicationFolder()+"/hxinvoiceFile/"+DDZXXName+"/"; + System.out.println("文件下载路径"+path); +// Thread.sleep(3000); +// 将附件下载到服务器 + List filePaths = fileUtil.fieldFileDownload(Long.parseLong(DDZXXName),path); +// 创建DDZXX对象 + JSONArray DDZXXS = new JSONArray(); + +// 税率判断 + String taxRes = ""; + double zje = 0; + double sj = 0; + double bhsje = 0; + for(String filePath : filePaths){ + JSONArray jsonArray = fileUtil.getFileContent(filePath); + context.setResponse(jsonArray.toString()); +// System.out.println("获取附件内容"+jsonArray); + for(int i = 0 ; i < jsonArray.size();i++){ + JSONObject fileJson = jsonArray.getJSONObject(i); + JSONArray SPS = fileJson.getJSONArray("SPS"); + log.info(SPS.size()+"批量开票文件行数"); + for (int n = 0 ; n < SPS.size() ; n++){ + JSONObject SP = SPS.getJSONObject(n); +// String SPBM = SP.getString("SPBM"); +// String XMMC = SP.getString("XMMC"); + String SL = SP.getString("SL"); +// List taxRates = hxinvoiceDao.getTaxRateByTaxItemCode(SPBM); +// if(!taxRates.contains(SL)){ +// List listWithoutDuplicates = new ArrayList<>(new HashSet<>(taxRates)); +// taxRes = taxRes+SPBM+XMMC+"税率不在"+listWithoutDuplicates.toString()+"中、"; +// } +// 获取当前金额 + String JE = SP.getString("JE"); +// 忽略千分位 + if(JE.contains(",")){ + try { + NumberFormat format = NumberFormat.getInstance(Locale.US); // 使用美国格式(千分位是逗号) + Number number = format.parse(JE); + double decimalValue = number.doubleValue(); + zje = zje +decimalValue; + } catch (ParseException e) { + context.back("金额填写异常,请检查金额字段是否为为数字格式"); + log.info("解析失败: " + e.getMessage()); + } + }else{ + // 当前金额转换成小数 + zje = zje +Double.parseDouble(JE); + } + + bhsje = bhsje + (Double.parseDouble(JE)/(1+Double.parseDouble(SL))); +// sj = sj+(Double.parseDouble(JE)*Double.parseDouble(SL)); + } + } + } +// if(taxRes.length()==0){ + formDataVo.getNewFieldDataMap().put("总金额合计", nf.format(zje)); + formDataVo.getNewFieldDataMap().put("税金合计", nf.format(zje-bhsje)); + formDataVo.getNewFieldDataMap().put("不含税金额合计", nf.format(bhsje)); + context.success("成功", false); +// }else{ +// taxRes = taxRes.substring(0,taxRes.length()-1)+"请重新填写"; +// context.back("开票清单校验失败:"+ taxRes); +// context.setErrMsg(taxRes); +// } +// 总金额=金额累计和 +// 税金 = (金额*税率)累计和 +// 不含税金额 = 总金额 - 税金 +// System.out.println("总金额"+nf.format(zje)); +// System.out.println("税金"+nf.format(sj)); +// System.out.println("不含税金额"+nf.format(zje-sj)); + return context; + } + + @Override + public String getNodeId() { + return "FileDataValidateNode"; + } + + @Override + public String getNodeName() { + return "批量数电发票开票附件校验超级节点"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/OrderToFastRedInvoiceFileNode.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/OrderToFastRedInvoiceFileNode.java new file mode 100644 index 0000000..b1ef785 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/node/OrderToFastRedInvoiceFileNode.java @@ -0,0 +1,307 @@ +package com.seeyon.apps.src_hxinvoice.node; + + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.collaboration.po.ColSummary; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.util.*; +import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse; +import com.seeyon.cap4.form.api.FormDataApi4Cap4; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.ctp.util.UUIDLong; +import com.seeyon.ctp.util.json.JSONUtil; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class OrderToFastRedInvoiceFileNode extends ACommonSuperNode { + + private static Log log = Log.get(OrderToFastRedInvoiceFileNode.class); + + public String getMethod() { + return "/sims-api/invoice/api/v6/QueryFastRedInvoiceResult"; + } + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Override + public String getNodeId() { + return "OrderToFastRedInvoiceFileNode"; + } + + @Override + public String getNodeName() { + return "数电订单快捷冲红返回结果获取超级节点"; + } + + public ConfigVo getHxinvoiceConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + @Override + public String getPluginId() { + return HxinvoiceConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + protected FormDataApi4Cap4 formDataApi4Cap4; + + public void setFormDataApi4Cap4(FormDataApi4Cap4 formDataApi4Cap4) { + this.formDataApi4Cap4 = formDataApi4Cap4; + } + + private IHxinvoiceDao hxinvoiceDao; + public void setHxinvoiceDao(IHxinvoiceDao hxinvoiceDao) {this.hxinvoiceDao = hxinvoiceDao;} + public IHxinvoiceDao getHxinvoiceDao() { + if (this.hxinvoiceDao == null) {this.hxinvoiceDao = ((IHxinvoiceDao) AppContext.getBean("hxinvoiceDao"));}return hxinvoiceDao; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + ConfigVo configVo = getHxinvoiceConfig(); + SuperNodeContext context = new SuperNodeContext(); + FileUtil fileUtil = new FileUtil(); + String localPath = SystemEnvironment.getApplicationFolder(); + try { +// secretKey + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); +// secretId + String secretId = configVo.getParamVal(HxinvoiceConstants.secretId.name()); +// 请求类型 + String requestType = "POST"; +// 接口地址 + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); +// 获取冲红接口地址 + String url = ipport+getMethod(); + context.setUrl(url); +// 设置自定义字段 + String dataExchangeId = UUIDLong.longUUID()+""; + System.out.println("设置冲红基础参数"); +// ProtUtil protUtil = new ProtUtil(); + String password =secretKey.substring(0,24); +// 压缩工具类 + GzipUtils gzipUtils = new GzipUtils(); +// 加解密工具类 + TripleDesUtil tripleDesUtil = new TripleDesUtil(); + ParamUtil paramUtil = new ParamUtil(); +// System.out.println("获取参数"); + log.info("处理前参数:"+request); + String contentParam =request; + context.setRequest(contentParam); + context.setNeedSave(true); + byte[] src = contentParam.getBytes(StandardCharsets.UTF_8); +// 判断是否需要加密 + String encryptCode = "1";//固定为1进行加密 + byte[] bys = {}; + if("1".equals(encryptCode)){ + // 进行加密 + bys = tripleDesUtil.encryptMode(password,src); + } +// 判断是否需要压缩 + String zipCode = "1";//固定为1进行压缩 + byte[] gzis = bys; + if("1".equals(zipCode)){ + // 进行压缩 + gzis = gzipUtils.compress(bys); + } +// System.out.println("加密完成"); +// 进行baes64加密 + String base64Encoded = Base64.encodeBase64URLSafeString(gzis); + log.info("base64Encoded:"+base64Encoded); +// 设置签名参数 + TreeMap treeMap = new TreeMap<>(); + treeMap.put("content",base64Encoded); + treeMap.put("dataExchangeId",dataExchangeId); + treeMap.put("encryptCode",encryptCode); + treeMap.put("secretId",secretId); + treeMap.put("zipCode",zipCode); + StringBuilder contentStr = new StringBuilder(); + + for (String key : treeMap.keySet()) { + contentStr.append(key+"="+treeMap.get(key)+"&"); + } +// System.out.println("准备签名完成"); + String content = contentStr.toString(); + content = content.substring(0,content.length()-1); + String[] urls = url.split("/"); + String uri = urls[0]; + String fuwu = "/" +urls[1]; + String path = "/"+urls[2]+"/"+urls[3]+"/"; + String banben = urls[4]; + String method = "/"+urls[5]; + String srcStr = requestType+uri+fuwu+path+banben+method+"?"+content; +// 进行签名 + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8")); +// 签名转换成字符串 + String signStr = Base64.encodeBase64URLSafeString(signBytes); +// System.out.println("signStr:"+signStr); +// 设置参数 + JSONObject jsonGenerateQdInvoice = new JSONObject(); + jsonGenerateQdInvoice.put("secretId",secretId); + jsonGenerateQdInvoice.put("dataExchangeId",dataExchangeId); + jsonGenerateQdInvoice.put("encryptCode",encryptCode); + jsonGenerateQdInvoice.put("zipCode",zipCode); + jsonGenerateQdInvoice.put("content",base64Encoded); + jsonGenerateQdInvoice.put("signature",signStr); +// System.out.println("准备调用"); +// JSONObject res = protUtil.doPost(jsonGenerateQdInvoice.toString(),"http://"+url); + String response = HxinvoiceHttpUtil.doPost("http://"+url, jsonGenerateQdInvoice.toString()); +// System.out.println(response); + JSONObject resjson = JSON.parseObject(response); +// System.out.println("调用完成"); + String con = resjson.getString("content"); + byte[] decodedBytes = Base64.decodeBase64(con); + String iszipCode = resjson.getString("zipCode"); + String isencryptCode = resjson.getString("encryptCode"); +// 是否需要进行解压 + byte[] dec = decodedBytes; + if("1".equals(iszipCode)){ + dec = gzipUtils.decompress(decodedBytes); + } +// 是否需要进行解密 + byte[] d= dec; + if("1".equals(isencryptCode)){ + d = tripleDesUtil.decryptMode(password,dec); + } + String str = new String(d,"UTF-8"); + context.setResponse(str); + JSONObject object = JSONUtil.parseJSONString(str, JSONObject.class); + HxinvoiceResponse hxinvoiceResponse = new HxinvoiceResponse(object,getMethod()); + if(hxinvoiceResponse.isSuccess()) { + JSONObject ret = JSONObject.parseObject(str); +// 获取返回附件 + JSONObject HZFPXX = ret.getJSONObject("HZFPXX"); + JSONObject DDFPXX = HZFPXX.getJSONObject("DDFPXX"); + JSONArray FILEITEMLISTS = HZFPXX.getJSONArray("FILEITEMLIST"); + List fileNames = new ArrayList(); + log.info("进行文件处理"); + for(int n = 0 ; n < FILEITEMLISTS.size() ; n++){ + JSONObject FILEITEMLIST = FILEITEMLISTS.getJSONObject(n); +// 获取后缀 + String WJLX = FILEITEMLIST.getString("WJLX"); + String FILECONTENT = FILEITEMLIST.getString("FILECONTENT"); +// bese64解密 + byte[] fileBytes = Base64.decodeBase64(FILECONTENT); + try { +// 判断文件路径是否存在 + String DDQQLSH = DDFPXX.getString("DDQQLSH"); + fileUtil.isFilePath(localPath+"/invoiceDate/CH_"+DDQQLSH); + String GMFMC = DDFPXX.getString("GMFMC"); + String DDSJ = DDFPXX.getString("DDSJ"); + String FPHM = DDFPXX.getString("FPHM"); + String newKPRQStr = DDSJ.replace("-", "").replace(" ", "").replace(":", ""); + String fileInvoiceName = "dzch_"+FPHM+"_"+GMFMC+"_"+newKPRQStr; + String fileName = localPath+"/invoiceDate/CH_"+DDQQLSH+"/"+fileInvoiceName+"."+WJLX; + log.info("将文件保存在指定地址"+fileName); + FileOutputStream fos = new FileOutputStream(fileName); + int bufferSize = 1024; // 每次写入的块大小为1KB + for (int t = 0; t < fileBytes.length; t += bufferSize) { + int length = Math.min(bufferSize, fileBytes.length - t); + fos.write(fileBytes, t, length); + } + fos.close(); + fileNames.add(fileName); + log.info("保存文件成功"); + } catch (IOException e) { +// System.out.println("保存文件时出错:" + e.getMessage()); + log.info("保存文件时出错:" + e.getMessage()); + } + } + ColSummary colSummary = formDataVo.getColSummary(); + long summaryId = colSummary.getId(); +// 附件上传到系统 + List attachments = fileUtil.fileUpload(fileNames,summaryId+"",AppContext.currentUserId(),AppContext.currentAccountId()); + log.info("调用方法上传附件成"); + String id = attachments.get(0).getSubReference()+""; + log.info("上传附件ID为"+id); +// 设置返回信息 + formDataVo.getNewFieldDataMap().put("红字发票附件", id); + String DDZT = DDFPXX.getString("DDZT"); + // "030000","订单开票成功""031000","订单未开票""031999","订单开票失败""032000","订单开票中""032999","订单无效" +// 查询枚举想信息 + String stateEnumId = configVo.getParamVal(HxinvoiceConstants.stateEnumId.name()); + Map stateEnum = hxinvoiceDao.getCtpEnumItemsByEnumId(stateEnumId); + String DDZTXX = DDFPXX.getString("DDZTXX"); + Map map = new HashMap<>(); + switch(DDZT){ + case "030000": + map.put("订单状态",stateEnum.get("订单开票成功")); + map.put("开票事项说明","开票成功:"+DDZTXX); + break; + case "031000": + map.put("订单状态",stateEnum.get("订单未开票")); + map.put("开票事项说明","未开票:"+DDZTXX); + break; + case "031999": + map.put("订单状态",stateEnum.get("订单开票失败")); + map.put("开票事项说明","开票失败:"+DDZTXX); + break; + case "032000": + map.put("订单状态",stateEnum.get("订单开票中")); + map.put("开票事项说明","开票中:"+DDZTXX); + break; + case "032999": + map.put("订单状态",stateEnum.get("订单无效")); + map.put("开票事项说明","无效:"+DDZTXX); + break; + } + formDataVo.getNewFieldDataMap().put("订单状态",map.get("订单状态") ); + formDataVo.getNewFieldDataMap().put("订单状态描述", map.get("开票事项说明")); + formDataVo.getNewFieldDataMap().put("电子税票系统返回结果", map.get("开票事项说明")); +// context.setException(true); + context.success("冲红结果查询成功:" +hxinvoiceResponse.getMsg(), false); + }else{ + context.setErrMsg(hxinvoiceResponse.getMsg()); + context.setException(true); + context.back("冲红结果查询失败:" +hxinvoiceResponse.getData()+ hxinvoiceResponse.getMsg()); + } + }catch (Exception e) { + e.printStackTrace(); + context.setException(true); + context.back("冲红结果查询失败:OA处理异常:" + e.getMessage()); + return context; + } + return context; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/GetOrderInfoAndInvoiceInfoQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/GetOrderInfoAndInvoiceInfoQuartz.java new file mode 100644 index 0000000..5bbd2f2 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/GetOrderInfoAndInvoiceInfoQuartz.java @@ -0,0 +1,291 @@ +package com.seeyon.apps.src_hxinvoice.quartz; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.apps.src_hxinvoice.util.FileUtil; +import com.seeyon.apps.src_hxinvoice.util.ProtUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GetOrderInfoAndInvoiceInfoQuartz extends AbstractQuartzTask { + + private static Log log = Log.get(GetOrderInfoAndInvoiceInfoQuartz.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + public String getPluginId() {return HxinvoiceConstants.getPluginId();} + public ConfigVo getHxinvoiceConfig() {return cstConfigApi.getConfig(getPluginId());} + + private IHxinvoiceDao hxinvoiceDao; + public void setHxinvoiceDao(IHxinvoiceDao hxinvoiceDao) {this.hxinvoiceDao = hxinvoiceDao;} + public IHxinvoiceDao getHxinvoiceDao() { + if (this.hxinvoiceDao == null) {this.hxinvoiceDao = ((IHxinvoiceDao) AppContext.getBean("hxinvoiceDao"));}return hxinvoiceDao; + } + + private IInvoiceService invoiceService; + public IInvoiceService getInvoiceService() { + if (this.invoiceService == null) { + this.invoiceService = ((IInvoiceService) AppContext.getBean("invoiceService")); + } + return invoiceService; + } + public void setInvoiceService(IInvoiceService invoiceService) { + this.invoiceService = invoiceService; + } + + private OrgManager orgManager; + public void setOrgManager(OrgManager orgManager) {this.orgManager = orgManager; } + public OrgManager getOrgManager() { + if (orgManager == null) {orgManager = (OrgManager) AppContext.getBean("orgManager");}return orgManager; + } + + @Override + public String taskRun(String p) throws Exception { + System.out.println("进入定时任务方法"+p); + FileUtil fileUtil = new FileUtil(); + String path = SystemEnvironment.getApplicationFolder(); + ConfigVo configVo = getHxinvoiceConfig(); + ProtUtil protUtil = new ProtUtil(); + String uploadMemberLoginName = configVo.getParamVal(HxinvoiceConstants.uploadMemberLoginName.name()); + V3xOrgMember v3xOrgMember = orgManager.getMemberByLoginName(uploadMemberLoginName); + String updateAccountName = configVo.getParamVal(HxinvoiceConstants.updateAccountName.name()); + V3xOrgAccount v3xOrgAccount = orgManager.getAccountByName(updateAccountName); + String methodName = "/sims-api/invoice/api/v6/GetOrderInfoAndInvoiceInfo"; + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); + String url = ipport+methodName; +// System.out.println("调用接口路径"+url); + log.info("调用接口路径"+url); +// 查询当前档案表中所有没有成功和失败的开票信息 + try{ + List> lists = hxinvoiceDao.getInvoicesByState(); +// System.out.println("查询符合要求的数据量"+lists.size()); + log.info("查询符合要求的数据量"+lists.size()); +// 循环查询到的所有订单信息 + for (Map invoiceMap:lists) { +// 调用接口查询当前订单内容 + JSONObject jsonObject =invoiceService.getInvoiceTypeParam(methodName,invoiceMap); + log.info("请求参数为"+jsonObject); + JSONObject res = protUtil.doPost(jsonObject.toString(),"http://"+url); + String contentStr =invoiceService.getInvoiceContentRes(res); + String s = "{'param':"+contentStr+"}"; +// JSONArray jso = JSONArray.parseObject(str); + JSONObject js = JSONObject.parseObject(s); + log.info("开票状态查询返回结果转json"+js); + JSONObject paramjson = js.getJSONObject("param"); + if("000000".equals(paramjson.getString("ZTDM"))){ + JSONArray DDFPZXXS = paramjson.getJSONArray("DDFPZXX"); + JSONObject DDFPZXX = DDFPZXXS.getJSONObject(0); + JSONObject DDFPXX = DDFPZXX.getJSONObject("DDFPXX"); + String DDQQLSH = DDFPXX.getString("DDQQLSH"); + String XHFSBH = DDFPXX.getString("XHFSBH"); + String formId = hxinvoiceDao.getInvoiceIdByCode(DDQQLSH,XHFSBH); +// System.out.println(DDQQLSH+XHFSBH+"查询到的主表ID为"+formId); + log.info(DDQQLSH+XHFSBH+"查询到的主表ID为"+formId); + if(!"0".equals(formId)){ +// FormExport formExport = new FormExport(); + Map map = new HashMap<>(); + String FPDM = DDFPXX.getString("FPDM");//发票代码 + String FPHM = DDFPXX.getString("FPHM");//发票号码 + String KPRQ = DDFPXX.getString("KPRQ");//开票日期 +// String SDEWMURL = DDFPXX.getString("SDEWMURL");//数电二维码交付地址 + String DDZT = DDFPXX.getString("DDZT");//订单状态 + String DDZTXX = DDFPXX.getString("DDZTXX");//订单状态描述 + String DDH = DDFPXX.getString("DDH");//订单状态描述 + String JSHJ = DDFPXX.getString("JSHJ");//主表价税合计 + String HJJE = DDFPXX.getString("HJJE");//主表合计金额 + String HJSE = DDFPXX.getString("HJSE");//主表合计税额 + log.info("定时任务关键字段回写:发票代码:"+FPDM+"发票号码"+FPHM+"开票日期"+KPRQ+"订单状态"+DDZT+"订单状态描述"+DDZTXX); + map.put("发票代码",FPDM); + map.put("发票号码",FPHM); + map.put("订单状态描述",DDZTXX); + map.put("实际开票日期",KPRQ); + map.put("订单号",DDH); + map.put("合计金额",JSHJ); + map.put("合计税额",HJSE); +// "030000","订单开票成功""031000","订单未开票""031999","订单开票失败""032000","订单开票中""032999","订单无效" +// 查询枚举想信息 + String stateEnumId = configVo.getParamVal(HxinvoiceConstants.stateEnumId.name()); + Map stateEnum = hxinvoiceDao.getCtpEnumItemsByEnumId(stateEnumId); + switch(DDZT){ + case "030000": + map.put("订单状态",stateEnum.get("订单开票成功")); + map.put("开票事项说明","开票成功:"+DDZTXX); + break; + case "031000": + map.put("订单状态",stateEnum.get("订单未开票")); + map.put("开票事项说明","未开票:"+DDZTXX); + break; + case "031999": + map.put("订单状态",stateEnum.get("订单开票失败")); + map.put("开票事项说明","开票失败:"+DDZTXX); + break; + case "032000": + map.put("订单状态",stateEnum.get("订单开票中")); + map.put("开票事项说明","开票中:"+DDZTXX); + break; + case "032999": + map.put("订单状态",stateEnum.get("订单无效")); + map.put("开票事项说明","无效:"+DDZTXX); + break; + } + map.put("电子税票系统返回结果",DDZTXX); +// System.out.println("对应MAP数据:"+map.toString()); + log.info("对应MAP数据:"+map.toString()); +// List valueExports = formExportUtil.setFormValue(map); +// formExport.setValues(valueExports); +// 数据id 登录名 表单编码 数据 +// long l = getFormFactory().updateBusinessFormData(Long.parseLong(formId),"oatest","KPSJDA",formExport); +// 附件处理 + if("030000".equals(DDZT)){ + JSONArray FILEITEMLISTS = DDFPZXX.getJSONArray("FILEITEMLIST"); + List fileNames = new ArrayList(); + log.info("进行文件处理"); + for(int n = 0 ; n < FILEITEMLISTS.size() ; n++){ + JSONObject FILEITEMLIST = FILEITEMLISTS.getJSONObject(n); +// 获取后缀 + String WJLX = FILEITEMLIST.getString("WJLX"); + String FILECONTENT = FILEITEMLIST.getString("FILECONTENT"); +// bese64解密 + byte[] fileBytes = Base64.decodeBase64(FILECONTENT); + try { +// 判断文件路径是否存在 + fileUtil.isFilePath(path+"/invoiceDate/"+DDQQLSH); + String GMFMC = DDFPXX.getString("GMFMC"); + String newKPRQStr = KPRQ.replace("-", "").replace(" ", "").replace(":", ""); + String fileInvoiceName = "dzfp_"+FPHM+"_"+GMFMC+"_"+newKPRQStr; + String fileName = path+"/invoiceDate/"+DDQQLSH+"/"+fileInvoiceName+"."+WJLX; + log.info("将文件保存在指定地址"+fileName); + FileOutputStream fos = new FileOutputStream(fileName); + int bufferSize = 1024; // 每次写入的块大小为1KB + for (int t = 0; t < fileBytes.length; t += bufferSize) { + int length = Math.min(bufferSize, fileBytes.length - t); + fos.write(fileBytes, t, length); + } + fos.close(); + fileNames.add(fileName); + log.info("保存文件成功"); + }catch (IOException e) { +// System.out.println("保存文件时出错:" + e.getMessage()); + log.info("保存文件时出错:" + e.getMessage()); + } + } + List attachments = fileUtil.fileUpload(fileNames,formId,v3xOrgMember.getId(),v3xOrgAccount.getId()); + log.info("调用方法上传附件成"); + String id = attachments.get(0).getSubReference()+""; + log.info("上传附件ID为"+id); + map.put("数电发票附件",id); + }else{ + map.put("数电发票附件",""); + } + int updateFormNum = hxinvoiceDao.updateInvoiceDataByNoCode(formId,map); +// System.out.println(formId+"修改主表数据为"+updateFormNum); + log.info(formId+"修改主表数据为"+updateFormNum); + if(updateFormNum==0){ + log.info("修改主表数据失败,进行下一个档案表数据修改操作"); + continue; + } +// 根据批次号查询是否为单一开票流程 + String dyFlowFormId = hxinvoiceDao.getInvoiceDYFlowIdByCode(DDQQLSH,XHFSBH); + if(!"0".equals(dyFlowFormId) && StringUtils.isNotEmpty(dyFlowFormId)){ +// 查询到当前流程号对应单一开票流程,设置返回值修改流程表单数据 + int updateInvoiceNum = hxinvoiceDao.updateInvoiceDYFlowByCode(map.get("开票事项说明"),DDQQLSH,XHFSBH); + if(updateInvoiceNum==0){ + log.info("修改单一开票流程数据失败,进行下一个档案表数据修改操作"); + continue; + } + }else{ +// 根据批次号查询是否为批量开票流程 + if(DDQQLSH.contains("_")){ + String[] ddqqlshs = DDQQLSH.split("_"); + Map plFlowFromData = hxinvoiceDao.getInvoicePLFlowIdByCode(ddqqlshs[0],XHFSBH); + if(plFlowFromData!=null){ + if(!"0".equals(plFlowFromData.get("id")) || StringUtils.isNotEmpty(plFlowFromData.get("id"))){ +// 根据返回结果,设置返回值修改流程表数据,查询到当前流程号对应单一开票流程,设置返回值修改流程表单数据 + +// 判断返回结果是否存在对应的编号信息 + String[] resDatas = plFlowFromData.get("resdata").split(";"); + String msg = ""; + for (String resData: resDatas) { + String[] ress = resData.split(":"); + if(ress[0].equals(ddqqlshs[1])){ + msg+=ress[0]+":"+map.get("开票事项说明")+";"; + }else{ + msg+= resData+";"; + } + } + msg = msg.substring(0,msg.length()-1); + int updateInvoiceNum = hxinvoiceDao.updateInvoicePLFlowByCode(msg,DDQQLSH,XHFSBH); + if(updateInvoiceNum==0){ + log.info("修改批量开票流程数据失败,进行下一个档案表数据修改操作"); + continue; + } + } + } + } + } + JSONArray DDMXXXS = DDFPZXX.getJSONArray("DDMXXX"); + for(int n = 0 ; n < DDMXXXS.size(); n++){ + JSONObject DDMXXX = DDMXXXS.getJSONObject(n); + String SE = DDMXXX.getString("SE"); + String SPBM = DDMXXX.getString("SPBM"); + int num = hxinvoiceDao.updateInvoiceByGoodsCode(formId,SPBM,SE); + if(num == 0 ){ + log.info("修改明细表数据为0记录修改参数"+formId+":"+SPBM+":"+SE); + } + System.out.println("修改明细表数据为"+num); + } + }else{ + System.out.println("没有查询到数据"); + } + }else{ + log.info("查询失败请检查参数信息"+invoiceMap.toString()); + String DDQQLSH = invoiceMap.get("ddqqlsh"); + String XHFSBH = invoiceMap.get("shuihao"); + JSONObject param = js.getJSONObject("param"); + String ZTXX = param.getString("ZTXX"); + String formId = hxinvoiceDao.getInvoiceIdByCode(DDQQLSH,XHFSBH); + Map map = new HashMap<>(); + String stateEnumId = configVo.getParamVal(HxinvoiceConstants.stateEnumId.name()); + Map stateEnum = hxinvoiceDao.getCtpEnumItemsByEnumId(stateEnumId); + + map.put("订单状态",stateEnum.get("订单开票失败")); + map.put("开票事项说明","开票失败:"+ZTXX); + int updateFormNum = hxinvoiceDao.updateInvoiceDataByNoCode(formId,map); +// System.out.println(formId+"修改主表数据为"+updateFormNum); + log.info(formId+"返回结果为空时修改主表数据为"+updateFormNum); + + } +// System.out.println(contentStr); + + } + }catch (Exception e){ + log.info(e.getMessage()); + e.printStackTrace(); + } + return null; + } + + @Override + public String getName() { + return "开票订单状态查询定时任务"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/QueryFastRedInvoiceResultQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/QueryFastRedInvoiceResultQuartz.java new file mode 100644 index 0000000..cc38da8 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/QueryFastRedInvoiceResultQuartz.java @@ -0,0 +1,91 @@ +package com.seeyon.apps.src_hxinvoice.quartz; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.apps.src_hxinvoice.util.ProtUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.organization.manager.OrgManager; +import java.util.List; +import java.util.Map; + +public class QueryFastRedInvoiceResultQuartz extends AbstractQuartzTask { + + private static Log log = Log.get(QueryFastRedInvoiceResultQuartz.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + public String getPluginId() {return HxinvoiceConstants.getPluginId();} + public ConfigVo getHxinvoiceConfig() {return cstConfigApi.getConfig(getPluginId());} + + private IHxinvoiceDao hxinvoiceDao; + public void setHxinvoiceDao(IHxinvoiceDao hxinvoiceDao) {this.hxinvoiceDao = hxinvoiceDao;} + public IHxinvoiceDao getHxinvoiceDao() { + if (this.hxinvoiceDao == null) {this.hxinvoiceDao = ((IHxinvoiceDao) AppContext.getBean("hxinvoiceDao"));}return hxinvoiceDao; + } + + private IInvoiceService invoiceService; + public void setInvoiceService(IInvoiceService invoiceService){this.invoiceService = invoiceService;} + public IInvoiceService getInvoiceService() { + if (this.invoiceService == null) { + this.invoiceService = ((IInvoiceService) AppContext.getBean("invoiceService")); + } + return invoiceService; + } + + private OrgManager orgManager; + public void setOrgManager(OrgManager orgManager) {this.orgManager = orgManager; } + public OrgManager getOrgManager() { + if (orgManager == null) {orgManager = (OrgManager) AppContext.getBean("orgManager");}return orgManager; + } + + @Override + public String taskRun(String p) throws Exception { + try{ + System.out.println("进入定时任务方法"+p); + ConfigVo configVo = getHxinvoiceConfig(); + ProtUtil protUtil = new ProtUtil(); + String methodName = "/sims-api/invoice/api/v6/QueryFastRedInvoiceResult"; + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); + String url = ipport+methodName; +// System.out.println("调用接口路径"+url); + log.info("调用接口路径"+url); + +// 查询冲红流程所有信息 + List> queryFastRedInvoices = hxinvoiceDao.queryFastRedInvoice(); +// System.out.println("查询符合要求的数据量"+queryFastRedInvoices.size()); + log.info("查询符合要求的数据量"+queryFastRedInvoices.size()); +// 遍历查询到的所有冲红信息 + for(Map queryFastRedInvoice:queryFastRedInvoices){ +// 调用接口查询当前冲红订单是否开票成功。 + JSONObject jsonObject =invoiceService.queryFastRedInvoiceResult(methodName,queryFastRedInvoice); + log.info("请求参数为"+jsonObject); +// 调用接口查询冲红结果 + JSONObject res = protUtil.doPost(jsonObject.toString(),"http://"+url); + String contentStr =invoiceService.getInvoiceContentRes(res); + JSONObject js = JSONObject.parseObject(contentStr); +// log.info("转json"+js); + if("000000".equals(js.getString("ZTDM"))){ +// 附件查询成功调用接口通过超级节点 + JSONObject params = new JSONObject(); + params.put("message", "开票完成!!!"); + params.put("returnCode", 1); + String rem = protUtil.sendPostNotification(params.toString(), configVo.getParamVal(HxinvoiceConstants.nodeTokenUrl.name()), queryFastRedInvoice.get("token"),configVo); + } + } + }catch (Exception e){ +// 异常处理,记录定时任务日志 + e.printStackTrace(); + } + return null; + } + + @Override + public String getName() { + return "冲红状态查询定时任务"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/TestQuartz.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/TestQuartz.java new file mode 100644 index 0000000..f648270 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/quartz/TestQuartz.java @@ -0,0 +1,204 @@ +package com.seeyon.apps.src_hxinvoice.quartz; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.dao.impl.HxinvoiceDaoImpl; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.apps.src_hxinvoice.util.FileUtil; +import com.seeyon.apps.src_hxinvoice.util.FormExportUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import www.seeyon.com.utils.StringUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TestQuartz extends AbstractQuartzTask { + + private static Log log = Log.get(QueryFastRedInvoiceResultQuartz.class); + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + public String getPluginId() {return HxinvoiceConstants.getPluginId();} + public ConfigVo getHxinvoiceConfig() {return cstConfigApi.getConfig(getPluginId());} + + private IHxinvoiceDao hxinvoiceDao; + public void setHxinvoiceDao(IHxinvoiceDao hxinvoiceDao) {this.hxinvoiceDao = hxinvoiceDao;} + public IHxinvoiceDao getHxinvoiceDao() { + if (this.hxinvoiceDao == null) {this.hxinvoiceDao = ((IHxinvoiceDao) AppContext.getBean("hxinvoiceDao"));}return hxinvoiceDao; + } + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew; } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");}return enumManagerNew; + } + + private IInvoiceService invoiceService; + public void setInvoiceService(IInvoiceService invoiceService){this.invoiceService = invoiceService;} + public IInvoiceService getInvoiceService() { + if (this.invoiceService == null) { + this.invoiceService = ((IInvoiceService) AppContext.getBean("invoiceService")); + } + return invoiceService; + } + + private OrgManager orgManager; + public void setOrgManager(OrgManager orgManager) {this.orgManager = orgManager; } + public OrgManager getOrgManager() { + if (orgManager == null) {orgManager = (OrgManager) AppContext.getBean("orgManager");}return orgManager; + } + + private FormFactory formFactory; + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + + @Override + public String taskRun(String p) throws Exception { + System.out.println("进入开票档案表创建超级节点"); + try{ + IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); + ConfigVo configVo = getHxinvoiceConfig(); + FileUtil fileUtil = new FileUtil(); + FormExportUtil formExportUtil = new FormExportUtil(); + String pp = "[{\"GMFNSRSBH\":\"92422823MA4DFD230X\",\"SPS\":[{\"GGXH\":\"\",\"XMMC\":\"白萝卜\",\"DW\":\"斤\",\"SPDJ\":\"1\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"50.5\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"50.5\",\"SPBM\":\"1010112010000000000\"},{\"GGXH\":\"9.5kg/件\",\"XMMC\":\"半边鸭\",\"DW\":\"件\",\"SPDJ\":\"95\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"13\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1235.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"本地胡萝卜\",\"DW\":\"斤\",\"SPDJ\":\"3.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"79.7\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"278.95\",\"SPBM\":\"1010112010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"大白菜\",\"DW\":\"斤\",\"SPDJ\":\"1.7\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"60.7\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"103.19\",\"SPBM\":\"1010112040000000000\"},{\"GGXH\":\"\",\"XMMC\":\"大葱\",\"DW\":\"斤\",\"SPDJ\":\"4.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"37\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"166.5\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"大红椒\",\"DW\":\"斤\",\"SPDJ\":\"7.8\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"5\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"39.0\",\"SPBM\":\"1010112090000000000\"},{\"GGXH\":\"10kg/件\",\"XMMC\":\"冻鸡翅尖\",\"DW\":\"件\",\"SPDJ\":\"175\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"4\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"700.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"10kg/件\",\"XMMC\":\"冻鸡胸肉\",\"DW\":\"件\",\"SPDJ\":\"146\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"3\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"438.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"900g*10袋/件\",\"XMMC\":\"冻毛豆仁\",\"DW\":\"件\",\"SPDJ\":\"100\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"2\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"200.0\",\"SPBM\":\"1030110010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"冻牛腩\",\"DW\":\"斤\",\"SPDJ\":\"29\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"25.5\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"739.5\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"10kg/件\",\"XMMC\":\"冻去骨鸡腿\",\"DW\":\"件\",\"SPDJ\":\"140\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"2\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"280.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"10kg/件\",\"XMMC\":\"冻去皮鸭胸\",\"DW\":\"件\",\"SPDJ\":\"168\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"6\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1008.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"2.5kg*4袋/件\",\"XMMC\":\"冻玉米粒\",\"DW\":\"件\",\"SPDJ\":\"60\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"7\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"420.0\",\"SPBM\":\"1010101030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"红洋葱\",\"DW\":\"斤\",\"SPDJ\":\"2.2\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"287\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"631.4\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"胡萝卜\",\"DW\":\"斤\",\"SPDJ\":\"1.7\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"110.7\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"188.19\",\"SPBM\":\"1010112010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"花菜\",\"DW\":\"斤\",\"SPDJ\":\"4.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"55\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"247.5\",\"SPBM\":\"1010112060000000000\"},{\"GGXH\":\"\",\"XMMC\":\"黄葱\",\"DW\":\"斤\",\"SPDJ\":\"5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"17.7\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"88.5\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"外地黄瓜\",\"XMMC\":\"黄瓜\",\"DW\":\"斤\",\"SPDJ\":\"2.6\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"106\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"275.6\",\"SPBM\":\"1010112080000000000\"},{\"GGXH\":\"9.7kg/件\",\"XMMC\":\"鸡边腿\",\"DW\":\"件\",\"SPDJ\":\"120\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"15\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1800.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"43斤/件\",\"XMMC\":\"鸡蛋\",\"DW\":\"件\",\"SPDJ\":\"253\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"6\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1518.0\",\"SPBM\":\"1010303020100000000\"},{\"GGXH\":\"\",\"XMMC\":\"豇豆\",\"DW\":\"斤\",\"SPDJ\":\"7.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"62\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"465.0\",\"SPBM\":\"1010112100000000000\"},{\"GGXH\":\"\",\"XMMC\":\"韭菜\",\"DW\":\"斤\",\"SPDJ\":\"6\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"9\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"54.0\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"辣椒节\",\"DW\":\"斤\",\"SPDJ\":\"15\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"10\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"150.0\",\"SPBM\":\"1010112090000000000\"},{\"GGXH\":\"\",\"XMMC\":\"里脊肉\",\"DW\":\"斤\",\"SPDJ\":\"18.4\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"100\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1840.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"莲藕\",\"DW\":\"斤\",\"SPDJ\":\"3.8\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"180.7\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"686.66\",\"SPBM\":\"1010112110000000000\"},{\"GGXH\":\"\",\"XMMC\":\"绿豆芽\",\"DW\":\"斤\",\"SPDJ\":\"1.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"15\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"22.5\",\"SPBM\":\"1010112140000000000\"},{\"GGXH\":\"\",\"XMMC\":\"平包白菜\",\"DW\":\"斤\",\"SPDJ\":\"1.7\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"80\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"136.0\",\"SPBM\":\"1010112040000000000\"},{\"GGXH\":\"\",\"XMMC\":\"茄子\",\"DW\":\"斤\",\"SPDJ\":\"4\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"92.5\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"370.0\",\"SPBM\":\"1010112090000000000\"},{\"GGXH\":\"\",\"XMMC\":\"瘦肉\",\"DW\":\"斤\",\"SPDJ\":\"17\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"20\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"340.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"蒜米\",\"DW\":\"斤\",\"SPDJ\":\"8\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"10\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"80.0\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"蒜苗\",\"DW\":\"斤\",\"SPDJ\":\"7\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"9\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"63.0\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"蒜苔\",\"DW\":\"斤\",\"SPDJ\":\"5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"40\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"200.0\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"通排骨\",\"DW\":\"斤\",\"SPDJ\":\"19\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"65\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1235.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"土豆\",\"DW\":\"斤\",\"SPDJ\":\"1.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"339\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"508.5\",\"SPBM\":\"1010102010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"五花肉\",\"DW\":\"斤\",\"SPDJ\":\"16\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"130\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"2080.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"西红柿\",\"DW\":\"斤\",\"SPDJ\":\"2.6\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"181.8\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"472.68\",\"SPBM\":\"1010112090000000000\"},{\"GGXH\":\"\",\"XMMC\":\"西兰花\",\"DW\":\"斤\",\"SPDJ\":\"5.7\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"26\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"148.2\",\"SPBM\":\"1010112060000000000\"},{\"GGXH\":\"\",\"XMMC\":\"西芹\",\"DW\":\"斤\",\"SPDJ\":\"3.6\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"213.4\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"768.24\",\"SPBM\":\"1010112070000000000\"},{\"GGXH\":\"\",\"XMMC\":\"小葱\",\"DW\":\"斤\",\"SPDJ\":\"8.6\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"4\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"34.4\",\"SPBM\":\"1010112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"小木耳\",\"DW\":\"斤\",\"SPDJ\":\"38\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"15\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"570.0\",\"SPBM\":\"1010112130000000000\"},{\"GGXH\":\"\",\"XMMC\":\"杏鲍菇\",\"DW\":\"斤\",\"SPDJ\":\"5.8\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"40\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"232.0\",\"SPBM\":\"1010112130000000000\"},{\"GGXH\":\"\",\"XMMC\":\"云南上海青菜\",\"DW\":\"斤\",\"SPDJ\":\"3.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"31\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"108.5\",\"SPBM\":\"1010112070000000000\"},{\"GGXH\":\"\",\"XMMC\":\"云南油麦菜\",\"DW\":\"斤\",\"SPDJ\":\"3.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"186.9\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"654.15\",\"SPBM\":\"1010112070000000000\"},{\"GGXH\":\"\",\"XMMC\":\"猪梅花肉\",\"DW\":\"斤\",\"SPDJ\":\"17.5\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"70\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"1225.0\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"猪肉沫\",\"DW\":\"斤\",\"SPDJ\":\"10.3\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"36\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"370.8\",\"SPBM\":\"1030107010100000000\"},{\"GGXH\":\"10个/提\",\"XMMC\":\"紫菜\",\"DW\":\"提\",\"SPDJ\":\"33\",\"ZKJE\":\"\",\"YHZCBS\":\"免税\",\"NUM\":\"8\",\"SL\":\"0\",\"FXHXZ\":\"正常行\",\"JE\":\"264.0\",\"SPBM\":\"1010112110000000000\"},{\"GGXH\":\"活称1*1.25\",\"XMMC\":\"白鲢/活称\",\"DW\":\"斤\",\"SPDJ\":\"4.6\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"15\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"69.0\",\"SPBM\":\"1010501000000000000\"},{\"GGXH\":\"\",\"XMMC\":\"草鱼/活称\",\"DW\":\"斤\",\"SPDJ\":\"8.8\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"40\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"352.0\",\"SPBM\":\"1010501000000000000\"},{\"GGXH\":\"\",\"XMMC\":\"粗辣椒面\",\"DW\":\"斤\",\"SPDJ\":\"15\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"10\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"150.0\",\"SPBM\":\"1010112090000000000\"},{\"GGXH\":\"约37.5斤/桶\",\"XMMC\":\"大豆油\",\"DW\":\"桶\",\"SPDJ\":\"198\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"9\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"1782.0\",\"SPBM\":\"1030105010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"冬枣\",\"DW\":\"斤\",\"SPDJ\":\"6\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"22\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"132.0\",\"SPBM\":\"1010115012700000000\"},{\"GGXH\":\"\",\"XMMC\":\"干海带\",\"DW\":\"斤\",\"SPDJ\":\"18\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"23\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"414.0\",\"SPBM\":\"1010405000000000000\"},{\"GGXH\":\"\",\"XMMC\":\"哈蜜瓜\",\"DW\":\"斤\",\"SPDJ\":\"4.8\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"130\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"624.0\",\"SPBM\":\"1010115012100000000\"},{\"GGXH\":\"\",\"XMMC\":\"红花椒\",\"DW\":\"斤\",\"SPDJ\":\"37.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"3\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"112.5\",\"SPBM\":\"1010117000000000000\"},{\"GGXH\":\"\",\"XMMC\":\"黄豆\",\"DW\":\"斤\",\"SPDJ\":\"3.8\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"20\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"76.0\",\"SPBM\":\"1010104010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"腊猪舌\",\"DW\":\"斤\",\"SPDJ\":\"32.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"20.4\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"663.0\",\"SPBM\":\"1030108040000000000\"},{\"GGXH\":\"10kg/件\",\"XMMC\":\"龙利鱼\",\"DW\":\"件\",\"SPDJ\":\"185\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"17\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"3145.0\",\"SPBM\":\"1010401000000000000\"},{\"GGXH\":\"\",\"XMMC\":\"苹果\",\"DW\":\"斤\",\"SPDJ\":\"5.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"44.9\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"246.95\",\"SPBM\":\"1010115010100000000\"},{\"GGXH\":\"500g*50包/袋\",\"XMMC\":\"食盐\",\"DW\":\"袋\",\"SPDJ\":\"45\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"45.0\",\"SPBM\":\"1030210010000000000\"},{\"GGXH\":\"48斤/袋\",\"XMMC\":\"丝苗香米\",\"DW\":\"袋\",\"SPDJ\":\"118\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"18\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"2124.0\",\"SPBM\":\"1030102010100000000\"},{\"GGXH\":\"\",\"XMMC\":\"土腊肉\",\"DW\":\"斤\",\"SPDJ\":\"25\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"20.2\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"505.0\",\"SPBM\":\"1030108040000000000\"},{\"GGXH\":\"25kg/袋\",\"XMMC\":\"五得利六星面粉\",\"DW\":\"袋\",\"SPDJ\":\"118\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"9\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"1062.0\",\"SPBM\":\"1030101010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"香蕉\",\"DW\":\"斤\",\"SPDJ\":\"4.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"44\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"198.0\",\"SPBM\":\"1010115010500000000\"},{\"GGXH\":\"5L/桶\",\"XMMC\":\"幺麻子藤椒油\",\"DW\":\"桶\",\"SPDJ\":\"208\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.09\",\"FXHXZ\":\"正常行\",\"JE\":\"208.0\",\"SPBM\":\"1030105010400000000\"},{\"GGXH\":\"500g/包\",\"XMMC\":\"安琪酵母粉\",\"DW\":\"包\",\"SPDJ\":\"18\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"10\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"180.0\",\"SPBM\":\"1030207010000000000\"},{\"GGXH\":\"约11斤/袋\",\"XMMC\":\"白粉条\",\"DW\":\"袋\",\"SPDJ\":\"42\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"42.0\",\"SPBM\":\"1030112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"冰糖\",\"DW\":\"斤\",\"SPDJ\":\"5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"10\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"50.0\",\"SPBM\":\"1030106030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"餐包(面包)\",\"DW\":\"个\",\"SPDJ\":\"1.2\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"150\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"180.0\",\"SPBM\":\"1030201020000000000\"},{\"GGXH\":\"\",\"XMMC\":\"大豆腐干\",\"DW\":\"斤\",\"SPDJ\":\"4.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"15\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"67.5\",\"SPBM\":\"1030113020000000000\"},{\"GGXH\":\"900g*10/袋\",\"XMMC\":\"大桥鸡精\",\"DW\":\"件\",\"SPDJ\":\"268\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"268.0\",\"SPBM\":\"1030206040000000000\"},{\"GGXH\":\"约15斤/袋\",\"XMMC\":\"东莞米粉\",\"DW\":\"袋\",\"SPDJ\":\"76\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"152.0\",\"SPBM\":\"1030203010000000000\"},{\"GGXH\":\"约15斤/袋\",\"XMMC\":\"东莞米粉\",\"DW\":\"件\",\"SPDJ\":\"76\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"152.0\",\"SPBM\":\"1030203010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"豆腐\",\"DW\":\"斤\",\"SPDJ\":\"2.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"80\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"200.0\",\"SPBM\":\"1030113010000000000\"},{\"GGXH\":\"25kg/袋\",\"XMMC\":\"风车超级生粉\",\"DW\":\"袋\",\"SPDJ\":\"308\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"308.0\",\"SPBM\":\"1030112019900000000\"},{\"GGXH\":\"1.9L*6瓶/件\",\"XMMC\":\"海天白醋\",\"DW\":\"件\",\"SPDJ\":\"50\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"50.0\",\"SPBM\":\"1030206030000000000\"},{\"GGXH\":\"1.9L*6/瓶\",\"XMMC\":\"海天陈醋\",\"DW\":\"件\",\"SPDJ\":\"63\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"63.0\",\"SPBM\":\"1030206030000000000\"},{\"GGXH\":\"6kg/桶\",\"XMMC\":\"海天蚝油\",\"DW\":\"桶\",\"SPDJ\":\"34\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"68.0\",\"SPBM\":\"1030206040000000000\"},{\"GGXH\":\"1.9L*6瓶/件\",\"XMMC\":\"海天老抽\",\"DW\":\"件\",\"SPDJ\":\"69\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"69.0\",\"SPBM\":\"1030206020000000000\"},{\"GGXH\":\"1.9L*6瓶/件\",\"XMMC\":\"海天生抽\",\"DW\":\"件\",\"SPDJ\":\"69\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"138.0\",\"SPBM\":\"1030206020000000000\"},{\"GGXH\":\"\",\"XMMC\":\"黑胡椒碎\",\"DW\":\"瓶\",\"SPDJ\":\"28\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"56.0\",\"SPBM\":\"1030206040000000000\"},{\"GGXH\":\"\",\"XMMC\":\"红糖(散)\",\"DW\":\"斤\",\"SPDJ\":\"5.3\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"20\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"106.0\",\"SPBM\":\"1030106020000000000\"},{\"GGXH\":\"\",\"XMMC\":\"胡椒粉\",\"DW\":\"斤\",\"SPDJ\":\"30\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"5\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"150.0\",\"SPBM\":\"1030206040000000000\"},{\"GGXH\":\"10斤/件\",\"XMMC\":\"花生酱丁\",\"DW\":\"件\",\"SPDJ\":\"36\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"3\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"108.0\",\"SPBM\":\"1030205040000000000\"},{\"GGXH\":\"27斤/件\",\"XMMC\":\"鸡蛋面\",\"DW\":\"件\",\"SPDJ\":\"70\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"9\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"630.0\",\"SPBM\":\"1030203010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"今明后草莓果酱\",\"DW\":\"瓶\",\"SPDJ\":\"7\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"24\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"168.0\",\"SPBM\":\"1030111020000000000\"},{\"GGXH\":\"180g*30袋\",\"XMMC\":\"蕨根粉丝\",\"DW\":\"件\",\"SPDJ\":\"86\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"172.0\",\"SPBM\":\"1030112030000000000\"},{\"GGXH\":\"\",\"XMMC\":\"辣妹子辣椒酱\",\"DW\":\"件\",\"SPDJ\":\"216\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"216.0\",\"SPBM\":\"1030206040000000000\"},{\"GGXH\":\"200g\",\"XMMC\":\"龙口粉丝\",\"DW\":\"袋\",\"SPDJ\":\"2.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"50\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"125.0\",\"SPBM\":\"1030203010000000000\"},{\"GGXH\":\"\",\"XMMC\":\"木薯淀粉\",\"DW\":\"斤\",\"SPDJ\":\"3.6\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"50\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"180.0\",\"SPBM\":\"1030112019900000000\"},{\"GGXH\":\"2kg*6袋/件\",\"XMMC\":\"泡野山椒\",\"DW\":\"件\",\"SPDJ\":\"40\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"40.0\",\"SPBM\":\"1030205040000000000\"},{\"GGXH\":\"400g*30袋/件\",\"XMMC\":\"千叶豆腐\",\"DW\":\"件\",\"SPDJ\":\"96\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"4\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"384.0\",\"SPBM\":\"1030113010000000000\"},{\"GGXH\":\"300g*12袋/件\",\"XMMC\":\"雀巢怡运奶粉\",\"DW\":\"件\",\"SPDJ\":\"266\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"266.0\",\"SPBM\":\"1030204020000000000\"},{\"GGXH\":\"10斤/件\",\"XMMC\":\"热干面萝卜丁\",\"DW\":\"件\",\"SPDJ\":\"27\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"54.0\",\"SPBM\":\"1030205040000000000\"},{\"GGXH\":\"2.5kg*4袋/件\",\"XMMC\":\"三全水饺\",\"DW\":\"件\",\"SPDJ\":\"105\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"210.0\",\"SPBM\":\"1030203020000000000\"},{\"GGXH\":\"300g*32包/件\",\"XMMC\":\"三五火锅底料\",\"DW\":\"包\",\"SPDJ\":\"9.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"64\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"608.0\",\"SPBM\":\"1030206040000000000\"},{\"GGXH\":\"\",\"XMMC\":\"手工水饺\",\"DW\":\"件\",\"SPDJ\":\"110\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"220.0\",\"SPBM\":\"1030203020000000000\"},{\"GGXH\":\"14斤/袋\",\"XMMC\":\"通心粉\",\"DW\":\"件\",\"SPDJ\":\"88\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"176.0\",\"SPBM\":\"1030203010000000000\"},{\"GGXH\":\"850g现做\",\"XMMC\":\"吐司面包\",\"DW\":\"条\",\"SPDJ\":\"20\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"12\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"240.0\",\"SPBM\":\"1030201020000000000\"},{\"GGXH\":\"10斤/件\",\"XMMC\":\"外婆菜\",\"DW\":\"件\",\"SPDJ\":\"55\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"1\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"55.0\",\"SPBM\":\"1030199000000000000\"},{\"GGXH\":\"\",\"XMMC\":\"王中王豆皮\",\"DW\":\"斤\",\"SPDJ\":\"8.8\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"18\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"158.4\",\"SPBM\":\"1030113020000000000\"},{\"GGXH\":\"760g*12袋/件\",\"XMMC\":\"维维豆奶\",\"DW\":\"件\",\"SPDJ\":\"258\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"2\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"516.0\",\"SPBM\":\"1030307030000000000\"},{\"GGXH\":\"10kg/件\",\"XMMC\":\"虾饺\",\"DW\":\"件\",\"SPDJ\":\"144\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"7\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"1008.0\",\"SPBM\":\"1030203020000000000\"},{\"GGXH\":\"\",\"XMMC\":\"油炸豆腐泡\",\"DW\":\"斤\",\"SPDJ\":\"7\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"20\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"140.0\",\"SPBM\":\"1030113020000000000\"},{\"GGXH\":\"25kg/袋\",\"XMMC\":\"玉米淀粉\",\"DW\":\"斤\",\"SPDJ\":\"2.5\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"50\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"125.0\",\"SPBM\":\"1030112010200000000\"},{\"GGXH\":\"15斤/件\",\"XMMC\":\"原味榨菜丝\",\"DW\":\"件\",\"SPDJ\":\"58\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"3\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"174.0\",\"SPBM\":\"1030205040000000000\"},{\"GGXH\":\"\",\"XMMC\":\"真空薄豆干\",\"DW\":\"斤\",\"SPDJ\":\"4.8\",\"ZKJE\":\"\",\"YHZCBS\":\"\",\"NUM\":\"30\",\"SL\":\"0.13\",\"FXHXZ\":\"正常行\",\"JE\":\"144.0\",\"SPBM\":\"1030113020000000000\"}],\"BZ\":\"2月\",\"DDH\":\"202502260001\",\"GMFMC\":\"巴东县传说餐饮部\"}]"; + p = "{\"param\":"+pp+"}"; +// 根据附件ID获取文件信息 + JSONObject jsonObjct = JSONObject.parseObject(p); +// 查询附件路径,解析附件文件 + JSONArray jsonArray = jsonObjct.getJSONArray("param"); +// 根据文件信息创建创建档案表参数 + for(int i = 0 ; i < jsonArray.size() ; i++){ + FormExport formExport = new FormExport(); + JSONObject paramjson = jsonArray.getJSONObject(i); +// 设置主表数据 + Map map = new HashMap<>(); + map.put("订单请求批次号","ZZKPPCH202502000009"); + map.put("订单请求流水号","ZZKPPCH202502000009_"+paramjson.getString("DDH")); + map.put("开票单据号","ZZKPPCH202502000009"); + map.put("公司名称","宜昌茅坪港旅游客运有限公司"); + map.put("销售方编号","20304"); + map.put("销售方名称","宜昌茅坪港旅游客运有限公司"); + map.put("销售方纳税人识别号","91420527747667719W"); + map.put("购买方编号",paramjson.getString("GMFNSRSBH")); + map.put("购买方信息",paramjson.getString("GMFMC")); + map.put("购买方税号",paramjson.getString("GMFNSRSBH")); + map.put("购买方联系方式",paramjson.getString("GMFSJ")); + map.put("购买方邮箱地址",paramjson.getString("GMFYX")); + map.put("电子税票系统返回结果",""); + List valueExports = formExportUtil.setFormValue(map); +// 设置明细表数据 + JSONArray sps = paramjson.getJSONArray("SPS"); + List> subMaps = new ArrayList<>(); + for(int n = 0 ; n spmap = new HashMap<>(); + JSONObject sp = sps.getJSONObject(n); + String spcode = sp.get("SPBM").toString(); + Map goods = hxinvoiceDao.getGoodsByCode(spcode); + spmap.put("商品税目分类编码",spcode); + spmap.put("税目编码",spcode); + spmap.put("项目名称",goods.get("spmc")); + if("折扣行".equals(sp.getString("FXHXZ"))){ + spmap.put("发票行性质编码","1");//发票行性质 + }else if ("被折扣行".equals(sp.getString("FXHXZ"))){ + spmap.put("发票行性质编码","2");//发票行性质 + }else{ + spmap.put("发票行性质编码","0");//发票行性质 + } +// Map fxhxzMap = hxinvoiceDao.getGoodsByCode(spcode); + String enumProCode = configVo.getParamVal(HxinvoiceConstants.enumProCode.name()); + CtpEnumBean fxhxzEnum = enumManagerNew.getEnumByProCode(enumProCode); + List fxhxzEnumItems = enumManagerNew.getCtpEnumItem(fxhxzEnum.getId(),0); + for (CtpEnumItem fxhxzEnumItem:fxhxzEnumItems) { + if(fxhxzEnumItem.getShowvalue().equals(sp.getString("FXHXZ"))){ + spmap.put("发票行性质",fxhxzEnumItem.getId()); + } + } + spmap.put("单位",sp.getString("DW")); + spmap.put("数量",sp.getString("NUM")); + spmap.put("单价",sp.getString("SPDJ")); + spmap.put("项目名称",sp.getString("XMMC")); + spmap.put("商品税目名称",goods.get("spmc"));//商品税目名称 + spmap.put("规格",sp.getString("GGXH"));//商品税目名称 + spmap.put("金额",sp.getString("JE")); + spmap.put("折扣金额",sp.getString("ZKJE")); +// if(!(goods.get("lsbs") == null)){ +// String lsbs = goods.get("lsbs").toString(); +// CtpEnumItem lsbsEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(lsbs)); +// String lsbsstr = lsbsEnum.getValue(); +// spmap.put("零税率标识",lsbsstr);//零税标识 +// } +// if(!(goods.get("yhzcbs") == null)){ +// String yhzcbs = goods.get("yhzcbs").toString(); +// CtpEnumItem yhzcbsEnum = getEnumManagerNew().getCtpEnumItem(Long.parseLong(yhzcbs)); +// String yhzcbsstr = yhzcbsEnum.getValue(); +// spmap.put("优惠政策标识",yhzcbsstr);//优惠政策标识 +// } + if(StringUtil.isNotEmpty(sp.getString("ZZSTSGL"))){ + spmap.put("增值税特殊管理","免税");//增值税特殊管理 + String yhzcbsProCode = configVo.getParamVal(HxinvoiceConstants.yhzcbsProCode.name()); + CtpEnumBean yhzcbsEnum = enumManagerNew.getEnumByProCode(yhzcbsProCode); + List yhzcbsItems = enumManagerNew.getCtpEnumItem(yhzcbsEnum.getId(),0); + String yhzcbsstr = ""; + for (CtpEnumItem yhzcbsItem:yhzcbsItems) { + if("免税".equals(yhzcbsItem.getShowvalue())){ + yhzcbsstr = yhzcbsItem.getId().toString(); + } + } + spmap.put("优惠政策标识",yhzcbsstr);//优惠政策标识 + String lsbsProCode = configVo.getParamVal(HxinvoiceConstants.lsbsProCode.name()); + CtpEnumBean lsbsEnum = enumManagerNew.getEnumByProCode(lsbsProCode); + List lsbsItems = enumManagerNew.getCtpEnumItem(lsbsEnum.getId(),0); + String lsbsstr = ""; + for (CtpEnumItem lsbsItem:lsbsItems) { + if("零税率".equals(lsbsItem.getShowvalue())){ + lsbsstr = lsbsItem.getId().toString(); + } + } + spmap.put("零税率标识",lsbsstr);//零税标识 + } + String sl = sp.getString("SL"); + spmap.put("税率",sl);//税率 + subMaps.add(spmap); + } + List subordinateFormExports = formExportUtil.setSubordinateFormValue(subMaps); + formExport.setValues(valueExports); + formExport.setSubordinateForms(subordinateFormExports); + log.info("准备创建开票档案表"); + String loginName = configVo.getParamVal(HxinvoiceConstants.uploadMemberLoginName.name()); + getFormFactory().importBusinessFormData(loginName, "KPSJDA",formExport, new String[] {}); + } + }catch (Exception e){ + e.printStackTrace(); + } +// 封装档案表参数 +// 使用档案表创建方法生成档案表 + + return null; + } + + @Override + public String getName() { + return "冲红状态查询定时任务"; + } +} + + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/service/IInvoiceService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/service/IInvoiceService.java new file mode 100644 index 0000000..294fc0b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/service/IInvoiceService.java @@ -0,0 +1,24 @@ +package com.seeyon.apps.src_hxinvoice.service; + + +import com.alibaba.fastjson.JSONObject; + +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; +import java.util.Map; + +public interface IInvoiceService { + + public JSONObject pushOrderInfoAndInvoiceInfoService(Map param) throws Exception; + + public JSONObject getInvoiceTypeParam(String methodName,Map paramMap) throws ParseException, UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException; + + public String getInvoiceContentRes(JSONObject content) throws Exception; + +// 查询快捷冲红结果 + public JSONObject queryFastRedInvoiceResult(String methodName,Map param) throws ParseException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException; + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/service/impl/InvoiceServiceImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/service/impl/InvoiceServiceImpl.java new file mode 100644 index 0000000..7c78878 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/service/impl/InvoiceServiceImpl.java @@ -0,0 +1,625 @@ +package com.seeyon.apps.src_hxinvoice.service.impl; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.apps.src_hxinvoice.util.*; +import com.seeyon.apps.src_powerfeeinvoice.service.PowerFeeService; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.StringUtil; +import com.seeyon.ctp.util.UUIDLong; +import com.seeyon.v3x.services.form.FormFactory; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + + +/** + * 配置web.xml完成回调函数 + */ +public class InvoiceServiceImpl implements IInvoiceService { + + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + private static Log log = Log.get(InvoiceServiceImpl.class); + private FormFactory formFactory; + public FormFactory getFormFactory() { + if (formFactory == null) {formFactory = (FormFactory) AppContext.getBean("formFactory");}return formFactory; + } + + public ConfigVo getHxinvoiceConfig() {return cstConfigApi.getConfig(getPluginId());} + + public String getPluginId() {return HxinvoiceConstants.getPluginId();} + + private IHxinvoiceDao hxinvoiceDao; + public void setHxinvoiceDao(IHxinvoiceDao hxinvoiceDao) {this.hxinvoiceDao = hxinvoiceDao;} + public IHxinvoiceDao getHxinvoiceDao() { + if (this.hxinvoiceDao == null) {this.hxinvoiceDao = ((IHxinvoiceDao)AppContext.getBean("hxinvoiceDao"));}return hxinvoiceDao; + } + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew; } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");}return enumManagerNew; + } + + private OrgManager orgManager; + public void setOrgManager(OrgManager orgManager) {this.orgManager = orgManager; } + public OrgManager getOrgManager() { + if (orgManager == null) {orgManager = (OrgManager) AppContext.getBean("orgManager");}return orgManager; + } + + private void handlePowerFeeCallBack(String DDQQLSH,JSONObject DDFPXX,JSONArray FILEITEMLISTS,String orderState,String invoiceItemDesc,Long memberId,Long account) throws Exception { + //发票号码 + //发票代码 + //实际开票日期 + //订单状态 + //订单状态描述 + //数电发票附件 + //查询档案 + String path = SystemEnvironment.getApplicationFolder(); + //处理水电费开票信息回写 + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String FPDM = DDFPXX.getString("FPDM");//发票代码 + String FPHM = DDFPXX.getString("FPHM");//发票号码 + String KPRQ = null; + try { + KPRQ = df.format(df.parse(DDFPXX.getString("KPRQ"))); + }catch (Exception e) { + e.printStackTrace(); + } + String DDH = DDFPXX.getString("DDH");//订单号 + Map map = new HashMap<>(); + map.put("发票代码",FPDM); + map.put("发票号码",FPHM); + map.put("实际开票日期",KPRQ); + map.put("订单状态",orderState); + map.put("订单请求流水号",DDQQLSH); + map.put("订单请求批次号",DDH); + map.put("订单状态描述",invoiceItemDesc); + map.put("订单号",DDH); + map.put("发票类型代码",DDFPXX.getString("FPLXDM")); + map.put("购买方信息",DDFPXX.getString("GMFMC"));//购买方名称 + map.put("购买方税号",DDFPXX.getString("GMFSBH")); //购买方税号 + map.put("购买方编号",""); + map.put("销售方纳税人识别号",DDFPXX.getString("XHFSBH")); + map.put("销售方编号",""); + map.put("销售方名称",DDFPXX.getString("XHFMC")); + map.put("开票日期",KPRQ); + map.put("开票人",DDFPXX.getString("KPR")); + map.put("购买方联系方式",DDFPXX.getString("GMFDH")); + map.put("开票类型",DDFPXX.getString("KPLX")); + map.put("系统来源",""); + map.put("本次开票金额",DDFPXX.getString("JSHJ")); + map.put("电子税票系统返回结果",invoiceItemDesc); + //附件处理 + List fileNames = new ArrayList(); + saveAttachments(fileNames,FILEITEMLISTS,path,DDQQLSH,DDFPXX,KPRQ,FPHM); + PowerFeeService powerFeeService = new PowerFeeService(); + powerFeeService.updatePowerFeeForm(map); + powerFeeService.insertIntoInvoiceForm(map,fileNames,memberId,account); + } + + private void saveAttachments(List fileNames,JSONArray FILEITEMLISTS,String path,String DDQQLSH,JSONObject DDFPXX,String KPRQ,String FPHM) { + FileUtil fileUtil = new FileUtil(); + for(int n = 0 ; n < FILEITEMLISTS.size() ; n++){ + JSONObject FILEITEMLIST = FILEITEMLISTS.getJSONObject(n); +// 获取后缀 + String WJLX = FILEITEMLIST.getString("WJLX"); + String FILECONTENT = FILEITEMLIST.getString("FILECONTENT"); +// bese64解密 + byte[] fileBytes = Base64.decodeBase64(FILECONTENT); + try { +// 判断文件路径是否存在 + fileUtil.isFilePath(path+"/invoiceDate/"+DDQQLSH); + String GMFMC = DDFPXX.getString("GMFMC"); + String newKPRQStr = KPRQ.replace("-", "").replace(" ", "").replace(":", ""); + String fileInvoiceName = "dzfp_"+FPHM+"_"+GMFMC+"_"+newKPRQStr; + String fileName = path+"/invoiceDate/"+DDQQLSH+"/"+fileInvoiceName+"."+WJLX; + FileOutputStream fos = new FileOutputStream(fileName); + int bufferSize = 1024; // 每次写入的块大小为1KB + for (int t = 0; t < fileBytes.length; t += bufferSize) { + int length = Math.min(bufferSize, fileBytes.length - t); + fos.write(fileBytes, t, length); + } + fos.close(); + fileNames.add(fileName); + } catch (IOException e) { + System.out.println("保存文件时出错:" + e.getMessage()); + } + } + } + + @Override + public JSONObject pushOrderInfoAndInvoiceInfoService(Map param) throws Exception { + ConfigVo configVo = getHxinvoiceConfig(); +// 获取产品标准地址 + String path = SystemEnvironment.getApplicationFolder(); + FileUtil fileUtil = new FileUtil(); +// FormExportUtil formExportUtil = new FormExportUtil(); +// JSONObject res = new JSONObject(); +// 获取附件上传接口人员登录信息 + String uploadMemberLoginName = configVo.getParamVal(HxinvoiceConstants.uploadMemberLoginName.name()); +// 根据人员登录名获取人员对象信息 + V3xOrgMember v3xOrgMember = orgManager.getMemberByLoginName(uploadMemberLoginName); +// 获取附件上传单位名称 + String updateAccountName = configVo.getParamVal(HxinvoiceConstants.updateAccountName.name()); +// 根据单位名称获取单位对象信息 + V3xOrgAccount v3xOrgAccount = orgManager.getAccountByName(updateAccountName); +// secretKey,解析回调参数中的信息 + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); + String password = secretKey.substring(0,24); + GzipUtils gzipUtils = new GzipUtils(); + TripleDesUtil tripleDesUtil = new TripleDesUtil(); + String stateEnumId = configVo.getParamVal(HxinvoiceConstants.stateEnumId.name()); + Map stateEnum = hxinvoiceDao.getCtpEnumItemsByEnumId(stateEnumId); + String con = param.get("content").toString(); +// System.out.println(con); +// System.out.println(""); + byte[] decodedBytes = Base64.decodeBase64(con); +// 判断是否压缩 + String iszipCode = param.get("zipCode") == null ? "0" : param.get("zipCode").toString(); + byte[] dec = decodedBytes; + if("1".equals(iszipCode)){ + dec = gzipUtils.decompress(decodedBytes); + } +// 判断是否加密 + byte[] d= dec; + String isencryptCode = param.get("encryptCode").toString(); + if("1".equals(isencryptCode)){ + d = tripleDesUtil.decryptMode(password,dec); + } +// 编码转译 + String str = new String(d,"UTF-8"); + String s = "{'param':"+str+"}"; +// JSONArray jso = JSONArray.parseObject(str); + JSONObject js = JSONObject.parseObject(s); + JSONArray jsonArray = js.getJSONArray("param"); + JSONArray jsonres = new JSONArray(); + for(int i = 0 ; i < jsonArray.size() ; i++){ + JSONObject jsonObject = jsonArray.getJSONObject(i); +// 获取发票号码、发票代码、实际开票日期、订单状态、凭证类型、数电票二维码 + JSONObject DDFPXX = jsonObject.getJSONObject("DDFPXX"); + String DDQQLSH = DDFPXX.getString("DDQQLSH"); + Map map = new HashMap<>(); + String FPDM = DDFPXX.getString("FPDM");//发票代码 + String FPHM = DDFPXX.getString("FPHM");//发票号码 + String KPRQ = DDFPXX.getString("KPRQ");//开票日期 +// String SDEWMURL = DDFPXX.getString("SDEWMURL");//数电二维码交付地址 + String DDZT = DDFPXX.getString("DDZT");//订单状态 + String DDZTXX = DDFPXX.getString("DDZTXX");//订单状态描述 + String DDH = DDFPXX.getString("DDH");//订单号 + String JSHJ = DDFPXX.getString("JSHJ");//主表价税合计 + String HJJE = DDFPXX.getString("HJJE");//主表合计金额 + String HJSE = DDFPXX.getString("HJSE");//主表合计税额 + + log.info("回调函数关键字段回写:发票代码:"+FPDM+"发票号码"+FPHM+"开票日期"+KPRQ+"订单状态"+DDZT+"订单状态描述"+DDZTXX); + + JSONArray FILEITEMLISTS = jsonObject.getJSONArray("FILEITEMLIST"); + + map.put("发票代码",FPDM); + map.put("合计金额",JSHJ); + map.put("合计税额",HJSE); + map.put("发票号码",FPHM); + map.put("订单状态描述",DDZTXX); + map.put("实际开票日期",KPRQ); + map.put("订单号",DDH); + switch(DDZT){ + case "030000": + map.put("订单状态",stateEnum.get("订单开票成功")); + map.put("开票事项说明","开票成功:"+DDZTXX); + break; + case "031000": + map.put("订单状态",stateEnum.get("订单未开票")); + map.put("开票事项说明","未开票:"+DDZTXX); + break; + case "031999": + map.put("订单状态",stateEnum.get("订单开票失败")); + map.put("开票事项说明","订单开票失败:"+DDZTXX); + break; + case "032000": + map.put("订单状态",stateEnum.get("订单开票中")); + map.put("开票事项说明","开票中:"+DDZTXX); + break; + case "032999": + map.put("订单状态",stateEnum.get("订单无效")); + map.put("开票事项说明","无效:"+DDZTXX); + break; + } + map.put("电子税票系统返回结果",DDZTXX); + String XHFSBH = DDFPXX.getString("XHFSBH"); + JSONArray DDMXXXS = jsonObject.getJSONArray("DDMXXX"); + if(DDQQLSH.startsWith("ZNDBLSH")){ + //处理电费开票数据回写 + JSONObject json = new JSONObject(); + json.put("DDQQLSH",DDQQLSH); + json.put("NSRSBH",XHFSBH); + try { + handlePowerFeeCallBack(DDQQLSH,DDFPXX,FILEITEMLISTS,map.get("订单状态"),map.get("开票事项说明"),v3xOrgMember.getId(),v3xOrgAccount.getId()); + json.put("ZTDM","000000"); + json.put("ZTXX","接收成功"); + jsonres.add(json); + }catch (Exception e) { + log.error(e); + json.put("ZTDM","009999"); + json.put("ZTXX","接收失败"); + jsonres.add(json); + } + }else { + String formId = hxinvoiceDao.getInvoiceIdByCode(DDQQLSH,XHFSBH); + System.out.println(DDQQLSH+":"+XHFSBH+"查询到的主表ID为"+formId); + if(!"0".equals(formId)){ + log.info("对应MAP数据:"+map.toString()); + + List fileNames = new ArrayList<>(); + saveAttachments(fileNames,FILEITEMLISTS,path,DDQQLSH,DDFPXX,KPRQ,FPHM); + List attachments = fileUtil.fileUpload(fileNames,formId,v3xOrgMember.getId(),v3xOrgAccount.getId()); + String id = attachments.get(0).getSubReference()+""; + map.put("数电发票附件",id); +// 返回档案表数据 + int updateFormNum = hxinvoiceDao.updateInvoiceDataByNoCode(formId,map); +// 根据批次号查询是否为单一开票流程 + String dyFlowFormId = hxinvoiceDao.getInvoiceDYFlowIdByCode(DDQQLSH,XHFSBH); + log.info("当前单一开票流程表单ID为"+dyFlowFormId); + if(!"0".equals(dyFlowFormId) && StringUtils.isNotEmpty(dyFlowFormId)){ +// 查询到当前流程号对应单一开票流程,设置返回值修改流程表单数据 + int updateInvoiceNum = hxinvoiceDao.updateInvoiceDYFlowByCode(map.get("开票事项说明"),DDQQLSH,XHFSBH); + if(updateInvoiceNum==0){ + JSONObject json = new JSONObject(); + json.put("DDQQLSH",DDQQLSH); + json.put("NSRSBH",XHFSBH); + json.put("ZTDM","009999"); + json.put("ZTXX","接收失败"); + jsonres.add(json); + continue; + } + }else{ +// 根据批次号查询是否为批量开票流程 + if(DDQQLSH.contains("_")){ + String[] ddqqlshs = DDQQLSH.split("_"); + Map plFlowFromData = hxinvoiceDao.getInvoicePLFlowIdByCode(ddqqlshs[0],XHFSBH); + if(plFlowFromData!=null){ + if(!"0".equals(plFlowFromData.get("id")) || StringUtils.isNotEmpty(plFlowFromData.get("id"))){ +// 根据返回结果,设置返回值修改流程表数据,查询到当前流程号对应单一开票流程,设置返回值修改流程表单数据 + +// 判断返回结果是否存在对应的编号信息 + String[] resDatas = plFlowFromData.get("resdata").split(";"); + String msg = ""; + for (String resData: resDatas) { + String[] ress = resData.split(":"); + if(ress[0].equals(ddqqlshs[1])){ + msg+=ress[0]+":"+map.get("开票事项说明")+";"; + }else{ + msg+= resData+";"; + } + } + msg = msg.substring(0,msg.length()-1); + int updateInvoiceNum = hxinvoiceDao.updateInvoicePLFlowByCode(msg,DDQQLSH,XHFSBH); + if(updateInvoiceNum==0){ + JSONObject json = new JSONObject(); + json.put("DDQQLSH",DDQQLSH); + json.put("NSRSBH",XHFSBH); + json.put("ZTDM","009999"); + json.put("ZTXX","接收失败"); + jsonres.add(json); + continue; + } + } + } + } + } +// System.out.println(formId+"修改主表数据为"+updateFormNum); + if(updateFormNum==0){ + JSONObject json = new JSONObject(); + json.put("DDQQLSH",DDQQLSH); + json.put("NSRSBH",XHFSBH); + json.put("ZTDM","009999"); + json.put("ZTXX","接收失败"); + jsonres.add(json); + continue; + } + for(int n = 0 ; n < DDMXXXS.size(); n++){ + JSONObject DDMXXX = DDMXXXS.getJSONObject(n); + String SE = DDMXXX.getString("SE"); + String SPBM = DDMXXX.getString("SPBM"); + int num = hxinvoiceDao.updateInvoiceByGoodsCode(formId,SPBM,SE); +// System.out.println("修改明细表数据为"+num); + } + JSONObject json = new JSONObject(); + json.put("DDQQLSH",DDQQLSH); + json.put("NSRSBH",XHFSBH); + json.put("ZTDM","000000"); + json.put("ZTXX","接收成功"); + jsonres.add(json); + }else{ +// System.out.println("没有查询到数据"); + JSONObject json = new JSONObject(); + json.put("DDQQLSH",DDQQLSH); + json.put("NSRSBH",XHFSBH); + json.put("ZTDM","009999"); + json.put("ZTXX","接收失败"); + jsonres.add(json); + } + } + } + JSONObject res = serReturn(jsonres,iszipCode,isencryptCode); + log.info("开票回调处理完成后返回的json为: " + jsonres); + return res; + } + + @Override + public JSONObject getInvoiceTypeParam(String methodName,Map paramMap) throws ParseException, UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ConfigVo configVo = getHxinvoiceConfig(); + // secretKey + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); + String password = secretKey.substring(0,24); + GzipUtils gzipUtils = new GzipUtils(); + TripleDesUtil tripleDesUtil = new TripleDesUtil(); +// secretId + String secretId = configVo.getParamVal(HxinvoiceConstants.secretId.name()); +// 请求类型 + String requestType = "POST"; +// 接口地址 + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); + String url = ipport+methodName; +// System.out.println(url); +// 设置自定义字段 + String dataExchangeId = UUIDLong.longUUID()+""; + JSONObject contentParam = new JSONObject(); + contentParam.put("NSRSBH",paramMap.get("shuihao")); + contentParam.put("DDQQLSH",paramMap.get("ddqqlsh")); + contentParam.put("TQM",""); +// contentParam.put("DDH", paramMap.get("dingdan")); + contentParam.put("DDH", ""); + contentParam.put("HZQRDBH", ""); + contentParam.put("BSWJ", ""); + contentParam.put("WJLX", "PDF"); + contentParam.put("DDRQQ", paramMap.get("ddrqq")); + String ddrqzStr = paramMap.get("ddrqz"); +// System.out.println(paramMap.get("ddrqq")+"--"+ddrqzStr); + Date ddrqzdate = sdf.parse(ddrqzStr); + if(ddrqzdate.getTime() treeMap = new TreeMap<>(); + treeMap.put("content",base64Encoded); + treeMap.put("dataExchangeId",dataExchangeId); + treeMap.put("encryptCode",encryptCode); + treeMap.put("secretId",secretId); + treeMap.put("zipCode",zipCode); + StringBuilder contentStr = new StringBuilder(); + for (String key : treeMap.keySet()) { + contentStr.append(key+"="+treeMap.get(key)+"&"); + } +// System.out.println("准备签名完成"); + String content = contentStr.toString(); + content = content.substring(0,content.length()-1); + String[] urls = url.split("/"); + String uri = urls[0]; + String fuwu = "/" +urls[1]; + String path = "/"+urls[2]+"/"+urls[3]+"/"; + String banben = urls[4]; + String method = "/"+urls[5]; + String srcStr = requestType+uri+fuwu+path+banben+method+"?"+content; +// 进行签名 + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8")); +// 签名转换成字符串 + String signStr = Base64.encodeBase64URLSafeString(signBytes); +// System.out.println("signStr:"+signStr); +// 设置参数 + JSONObject jsonGenerateQdInvoice = new JSONObject(); + jsonGenerateQdInvoice.put("secretId",secretId); + jsonGenerateQdInvoice.put("dataExchangeId",dataExchangeId); + jsonGenerateQdInvoice.put("encryptCode",encryptCode); + jsonGenerateQdInvoice.put("zipCode",zipCode); + jsonGenerateQdInvoice.put("content",base64Encoded); + jsonGenerateQdInvoice.put("signature",signStr); +// System.out.println("开票请求信息:"+jsonGenerateQdInvoice.toString()); + return jsonGenerateQdInvoice; + } + + @Override + public JSONObject queryFastRedInvoiceResult(String methodName,Map param) throws ParseException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ConfigVo configVo = getHxinvoiceConfig(); + // secretKey + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); + String password = secretKey.substring(0,24); + GzipUtils gzipUtils = new GzipUtils(); + TripleDesUtil tripleDesUtil = new TripleDesUtil(); +// secretId + String secretId = configVo.getParamVal(HxinvoiceConstants.secretId.name()); +// 请求类型 + String requestType = "POST"; +// 接口地址 + String ipport = configVo.getParamVal(HxinvoiceConstants.ipport.name()); + String url = ipport+methodName; +// System.out.println(url); +// 设置自定义字段 + String dataExchangeId = UUIDLong.longUUID()+""; + JSONObject contentParam = new JSONObject(); + contentParam.put("NSRSBH",param.get("nsrsbh")); + contentParam.put("HZFPXXQRDBH",param.get("hzfpxxqrdbh")); + contentParam.put("UUID",param.get("uuid")); +// System.out.println("请求参数为:"+contentParam.toString()); + byte[] src = contentParam.toString().getBytes(StandardCharsets.UTF_8); +// 判断是否需要加密 + String encryptCode = "1";//固定为1进行加密 + byte[] bys = {}; + if("1".equals(encryptCode)){ + // 进行加密 + bys = tripleDesUtil.encryptMode(password,src); + } +// 判断是否需要压缩 + String zipCode = "1";//固定为1进行压缩 + byte[] gzis = bys; + if("1".equals(zipCode)){ + // 进行压缩 + gzis = gzipUtils.compress(bys); + } +// 进行baes64加密 + String base64Encoded = Base64.encodeBase64URLSafeString(gzis); +// 设置签名参数 + TreeMap treeMap = new TreeMap<>(); + treeMap.put("content",base64Encoded); + treeMap.put("dataExchangeId",dataExchangeId); + treeMap.put("encryptCode",encryptCode); + treeMap.put("secretId",secretId); + treeMap.put("zipCode",zipCode); + StringBuilder contentStr = new StringBuilder(); + for (String key : treeMap.keySet()) { + contentStr.append(key+"="+treeMap.get(key)+"&"); + } +// System.out.println("准备签名完成"); + String content = contentStr.toString(); + content = content.substring(0,content.length()-1); + String[] urls = url.split("/"); + String uri = urls[0]; + String fuwu = "/" +urls[1]; + String path = "/"+urls[2]+"/"+urls[3]+"/"; + String banben = urls[4]; + String method = "/"+urls[5]; + String srcStr = requestType+uri+fuwu+path+banben+method+"?"+content; +// 进行签名 + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8")); +// 签名转换成字符串 + String signStr = Base64.encodeBase64URLSafeString(signBytes); +// System.out.println("signStr:"+signStr); +// 设置参数 + JSONObject jsonGenerateQdInvoice = new JSONObject(); + jsonGenerateQdInvoice.put("secretId",secretId); + jsonGenerateQdInvoice.put("dataExchangeId",dataExchangeId); + jsonGenerateQdInvoice.put("encryptCode",encryptCode); + jsonGenerateQdInvoice.put("zipCode",zipCode); + jsonGenerateQdInvoice.put("content",base64Encoded); + jsonGenerateQdInvoice.put("signature",signStr); +// System.out.println("开票请求信息:"+jsonGenerateQdInvoice.toString()); + log.info("开票请求信息:"+jsonGenerateQdInvoice.toString()); + return jsonGenerateQdInvoice; + } + + + @Override + public String getInvoiceContentRes(JSONObject res) throws Exception { + ConfigVo configVo = getHxinvoiceConfig(); +// System.out.println("进行解压"+res); + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); + String password = secretKey.substring(0,24); + // 压缩工具类 + GzipUtils gzipUtils = new GzipUtils(); +// 加解密工具类 + TripleDesUtil tripleDesUtil = new TripleDesUtil(); +// System.out.println("获取content参数"); + String con = res.getString("content"); + byte[] decodedBytes = Base64.decodeBase64(con); + String iszipCode = res.get("zipCode").toString(); + byte[] dec = decodedBytes; +// System.out.println("是否进行压缩"+iszipCode); + if("1".equals(iszipCode)){ + dec = gzipUtils.decompress(decodedBytes); + } + +// 判断是否加密 + byte[] d= dec; + String isencryptCode = res.get("encryptCode").toString(); +// System.out.println("是否进行加密"+isencryptCode); + if("1".equals(iszipCode)){ + d = tripleDesUtil.decryptMode(password,dec); + } +// 编码转译 + String str = new String(d,"UTF-8"); +// System.out.println("转译之后的参数"+str); + + return str; + } + + + private JSONObject serReturn(JSONArray jsonres,String iszipCode,String isencryptCode){ + JSONObject jsonObject = new JSONObject(); + ConfigVo configVo = getHxinvoiceConfig(); + GzipUtils gzipUtils = new GzipUtils(); + TripleDesUtil tripleDesUtil = new TripleDesUtil(); + String secretKey = configVo.getParamVal(HxinvoiceConstants.secretKey.name()); + String password = secretKey.substring(0,24); + log.info("回调完成后要返回的json: " + jsonres.toString()); + byte[] src = jsonres.toString().getBytes(StandardCharsets.UTF_8); +// 判断是否需要加密 + String encryptCode = "1";//固定为1进行加密 + byte[] bys = {}; + if("1".equals(encryptCode)){ + // 进行加密 + bys = tripleDesUtil.encryptMode(password,src); + } +// 判断是否需要压缩 + String zipCode = "1";//固定为1进行压缩 + byte[] gzis = bys; + if("1".equals(zipCode)){ + // 进行压缩 + gzis = gzipUtils.compress(bys); + } + String base64Encoded = Base64.encodeBase64URLSafeString(gzis); + jsonObject.put("returnCode","000000"); + jsonObject.put("zipCode",zipCode); + long l = UUIDLong.longUUID(); + jsonObject.put("dataExchangeId",l+""); + jsonObject.put("returnMessage","接口请求成功"); + jsonObject.put("encryptCode",encryptCode); + jsonObject.put("content",base64Encoded); + return jsonObject; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/servlet/PushOrderInfoAndInvoiceInfoServlet.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/servlet/PushOrderInfoAndInvoiceInfoServlet.java new file mode 100644 index 0000000..38e00a4 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/servlet/PushOrderInfoAndInvoiceInfoServlet.java @@ -0,0 +1,80 @@ +package com.seeyon.apps.src_hxinvoice.servlet; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.v3x.dee.util.DateUtil; +import org.apache.commons.io.FileUtils; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.Date; +import java.util.Map; + +public class PushOrderInfoAndInvoiceInfoServlet extends HttpServlet { + + private IInvoiceService invoiceService; + + + public IInvoiceService getInvoiceService() { + if (this.invoiceService == null) { + this.invoiceService = ((IInvoiceService) AppContext.getBean("invoiceService")); + } + return invoiceService; + } + public void setInvoiceService(IInvoiceService invoiceService) { + this.invoiceService = invoiceService; + } + + + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException { + System.out.println("进入票税系统回调方法"); +// 获取请求参数 + ServletOutputStream servletout = response.getOutputStream(); + InputStream servletin = request.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(servletin, "UTF-8")); + StringBuilder jsonData = new StringBuilder(); + String line; + while ((line = reader.readLine())!= null) { + jsonData.append(line); + } + ObjectMapper objectMapper = new ObjectMapper(); + // 将JSON字符串解析为Map(假设JSON数据是简单的键值对结构) + Map parameterMap = objectMapper.readValue(jsonData.toString(), Map.class); + +// String decodedUrl = ""; +// JSONObject param = JSONObject.parseObject(decodedUrl); + JSONObject res = null; + try { +// 日志记录请求参数 + String str = SystemEnvironment.getApplicationFolder(); + String date = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + FileUtils.writeStringToFile(new File(str+"/HxContractjson/"+date+"/HXFH_" + date + ".json"), jsonData.toString(), "UTF-8"); + res = getInvoiceService().pushOrderInfoAndInvoiceInfoService(parameterMap); + } catch (Exception e) { + e.printStackTrace(); + } + + String s = res.toString(); + + byte[] bytes = new byte[request.getContentLength()]; + servletin.read(bytes); + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + doGet(request, response); } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/sso/HxInvoicesso.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/sso/HxInvoicesso.java new file mode 100644 index 0000000..d0b121a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/sso/HxInvoicesso.java @@ -0,0 +1,60 @@ +package com.seeyon.apps.src_hxinvoice.sso; + +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_hxinvoice.util.SXAESUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.util.Strings; +import org.springframework.web.servlet.ModelAndView; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; + +public class HxInvoicesso extends BaseController { + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + + + + @Override + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception { + + ConfigVo config = cstConfigApi.getConfig(HxinvoiceConstants.getPluginId()); + + AddressBook addressBook = addressBookCustomerFieldInfoManager.getByMemberId(AppContext.currentUserId()); + if(null == addressBook) { + super.rendJavaScript(response, "alert('航信账号未维护,无法单点登录!');"); + return null; + } + String code = addressBook.getExtAttr3(); + if(Strings.isBlank(code)) { + super.rendJavaScript(response, "alert('航信账号未维护,无法单点登录!');"); + return null; + } +// 进行参数加密 + String time = String.valueOf(System.currentTimeMillis()); + String mw = URLEncoder.encode(SXAESUtil.aesEncrypt(code+","+time)); + try { + String url = config.getParamVal(HxinvoiceConstants.hxInvoicessoIpportUrl.name()); + String hxInvoicessoUrl = config.getParamVal(HxinvoiceConstants.hxInvoicessoUrl.name()); + String ssoUrl = url + hxInvoicessoUrl + mw; + response.sendRedirect(ssoUrl); +// } else { +// super.rendJavaScript(response, "alert('单点登录错误:" + hxinvoiceResponse.getMsg() + "');"); +// } + } catch (Exception e) { + logger.error("单点登录异常", e); + super.rendJavaScript(response, "alert('后台发生错误');"); + } + return null; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/Cap4ReturnUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/Cap4ReturnUtil.java new file mode 100644 index 0000000..98b1427 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/Cap4ReturnUtil.java @@ -0,0 +1,20 @@ +package com.seeyon.apps.src_hxinvoice.util; + + +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse; + +import com.seeyon.ctp.common.exceptions.BusinessException; + + + + +public class Cap4ReturnUtil { + + public void setParamReturn(String nodeId, HxinvoiceResponse hxinvoiceResponse, FormDataVo formDataVo) throws BusinessException { + + + } + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FileUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FileUtil.java new file mode 100644 index 0000000..c9de4fd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FileUtil.java @@ -0,0 +1,478 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.filemanager.Constants; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManagerImpl; +import com.seeyon.ctp.common.filemanager.manager.FileManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.ctp.common.po.filemanager.V3XFile; +import com.seeyon.ctp.services.FileUploadExporter; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import www.seeyon.com.utils.StringUtil; +import www.seeyon.com.utils.UUIDUtil; + +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.*; + +public class FileUtil { + + + private FileManager fileManager; + + public void setFileManager(FileManager fileManager) { + this.fileManager = fileManager; + } + + public FileManager getFileManager() { + if (fileManager == null) { + fileManager = (FileManager) AppContext.getBean("fileManager"); + } + return fileManager; + } + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManager() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + public void isFilePath(String filePath) { + File directory = new File(filePath); + if (!directory.exists()) { + directory.mkdirs(); + } + + } + + + /** + * 上传附件 + * + * @param fileNames + * @throws Exception + * @throws NumberFormatException + */ + public List fileUpload(List fileNames, String summaryId, Long memberId, Long accountId) throws NumberFormatException, Exception { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// List> lists = dataDao.findAttachAll(id); + FileUploadExporter fileUpload = new FileUploadExporter(); + List attachments = new ArrayList(); + File f = null; + long l = UUIDUtil.getUUIDLong(); + for (int i = 0; i < fileNames.size(); i++) { + String fileName = fileNames.get(i); + if (StringUtils.isNotEmpty(fileName)) { + f = new File(fileName); + if (!f.exists()) { + return null; + } + if (f.length() > 102400000) { + return null; + } + } + String[] strs = new String[]{f.getAbsolutePath()}; + String s = fileUpload.processUpload(strs); + +// if(StringUtils.isNotEmpty(s)) { + Map map = new HashMap(); + String attachName = f.getName(); + String[] suffixNames = attachName.split("\\."); + map.put("type", "0"); + map.put("fileUrl", s); + map.put("mimeType", "application/" + suffixNames[suffixNames.length - 1].toLowerCase()); +// if(suffixNames[suffixNames.length-1].equals("docx")) { +// map.put("mimeType", "application/docx"); +// }else { +// map.put("mimeType", "image/png"); +// } + map.put("size", f.length() + ""); +// System.out.println(beanId); + + map.put("subReference", l + ""); + map.put("category", "66"); + map.put("createdate", sdf.format(new Date())); + map.put("filename", f.getName()); + map.put("reference", summaryId); + Attachment attachment = new Attachment(map); + + attachments.add(attachment); + } + +// } + String str = getAttachmentManager().create(attachments, memberId, accountId); +// attachmentManager.create(attachments); +// System.out.println(str); + return attachments; + } + + + public List fieldFileDownload(long attachmentReferenceId, String path) throws BusinessException { +// 判断路径是否存在 + File file = new File(path); + if (!file.exists()) { + file.mkdirs(); + } +// System.out.println("文件ID为"+attachmentReferenceId); +// List attachments = getAttachmentManager().getByReference(attachmentReferenceId); + List fileUrls = getAttachmentManager().getBySubReference(attachmentReferenceId); + +// List attachments = new ArrayList<>(); + System.out.println(fileUrls.size()); + List filepaths = new ArrayList<>(); + for (Long fileUrl : fileUrls) { + Attachment attachment = getAttachmentManager().getAttachmentByFileURL(fileUrl); + System.out.println("根据文件ID查询文件流"); + InputStream inputStream = getFileManager().getFileInputStream(attachment.getFileUrl()); + System.out.println("文件名称"+attachment.getFilename()); + String filepath = path + attachment.getFilename(); + try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filepath))) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + outputStream.flush(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + filepaths.add(filepath); + } + return filepaths; + } + + + public JSONArray getFileContent(String filePath) throws IOException { + JSONArray jsonArray = new JSONArray(); + String houzhui = filePath.substring(filePath.lastIndexOf(".") + 1); + // 创建文件输入流 + FileInputStream file = new FileInputStream(new File(filePath)); + // 创建工作簿对象 + Workbook workbook; + System.out.println("当前文件为"+houzhui+"后缀"); + if ("xlsx".equals(houzhui) || "XLSX".equals(houzhui)) { + workbook = new XSSFWorkbook(file); + } else { + workbook = new HSSFWorkbook(file); + } + // 获取第一个工作表 + Sheet sheet = workbook.getSheetAt(0); + // 迭代行 + Iterator rowIterator = sheet.iterator(); +// 根据行跳过设置 + row : while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + if (row.getRowNum() < 2) { + continue; + } + int num = 0; + int bj = 0; + JSONObject jsonObject = new JSONObject(); + JSONArray SPS = new JSONArray(); + JSONObject SP = new JSONObject(); + boolean isddh = false; + + // 迭代单元格 + Iterator cellIterator = row.cellIterator(); + cell : while (cellIterator.hasNext()) { +// 获取单元格对象 + Cell cell = cellIterator.next(); +// 单元格索引为1的数据(订单号) + if (cell.getColumnIndex() == 1) { + String ddh = ""; + switch (cell.getCellType()) { + case STRING: + ddh = cell.getStringCellValue(); + break; + case NUMERIC: + ddh = cell.getNumericCellValue()+""; + break; + default: + ddh = ""; + } +// 如果当前订单号为空,则跳过当前行数据 +// 查询当前订单号是否已经存在 + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject json = jsonArray.getJSONObject(i); + if (ddh.equals(json.getString("DDH"))) { +// 订单号已经存在 + bj = i; + isddh = true; + jsonObject = json; + SPS = jsonObject.getJSONArray("SPS"); + } else { + num++; + } + } + if (num == jsonArray.size()) { +// switch (cell.getCellType()) { +// case STRING: + jsonObject.put("DDH",ddh); +// break; +// case NUMERIC: +// jsonObject.put("DDH", cell.getNumericCellValue()); +// break; +// default: +// jsonObject.put("DDH", ""); +// } +//// jsonObject.put("DDH", cell.getStringCellValue()); + } + } + switch (cell.getColumnIndex()) { + case 3: + if (!isddh) { + switch (cell.getCellType()) { + case STRING: + jsonObject.put("GMFMC", cell.getStringCellValue()); + break; + case NUMERIC: + jsonObject.put("GMFMC", cell.getNumericCellValue()); + break; + default: + jsonObject.put("GMFMC", ""); + } + } + break; + case 4: + if (!isddh) { + switch (cell.getCellType()) { + case STRING: + jsonObject.put("GMFNSRSBH", cell.getStringCellValue()); + break; + case NUMERIC: + jsonObject.put("GMFNSRSBH", cell.getNumericCellValue()); + break; + default: + jsonObject.put("GMFNSRSBH", ""); + } + } + break; + case 5: + if (!isddh) { + switch (cell.getCellType()) { + case STRING: + jsonObject.put("GMFYX", cell.getStringCellValue()); + break; + case NUMERIC: + jsonObject.put("GMFYX", cell.getNumericCellValue()); + break; + default: + jsonObject.put("GMFYX", ""); + } + } + break; + case 6: + if (!isddh) { + switch (cell.getCellType()) { + case STRING: + jsonObject.put("GMFSJ", cell.getStringCellValue()); + break; + case NUMERIC: + jsonObject.put("GMFSJ", cell.getNumericCellValue()); + break; + default: + jsonObject.put("GMFSJ", ""); + } + } + break; + case 17: + if (!isddh) { + switch (cell.getCellType()) { + case STRING: + jsonObject.put("BZ", cell.getStringCellValue()); + break; + case NUMERIC: + jsonObject.put("BZ", cell.getNumericCellValue()); + break; + default: + jsonObject.put("BZ", ""); + } + } + break; + case 2: + switch (cell.getCellType()) { + case STRING: + SP.put("FXHXZ", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("FXHXZ", cell.getNumericCellValue()); + break; + default: + SP.put("FXHXZ", ""); + } + break; + case 7: + switch (cell.getCellType()) { + case STRING: + SP.put("XMMC", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("XMMC", cell.getNumericCellValue()); + break; + default: + SP.put("XMMC", ""); + } + break; + case 8: + switch (cell.getCellType()) { + case STRING: + SP.put("SPBM", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("SPBM", cell.getNumericCellValue()); + break; + default: + SP.put("SPBM", ""); + } + break; + case 9: + switch (cell.getCellType()) { + case STRING: + SP.put("GGXH", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("GGXH", cell.getNumericCellValue()); + break; + default: + SP.put("GGXH", ""); + } + break; + case 10: + switch (cell.getCellType()) { + case STRING: + SP.put("DW", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("DW", cell.getNumericCellValue()); + break; + default: + SP.put("DW", ""); + } + break; + case 11: + switch (cell.getCellType()) { + case STRING: + SP.put("NUM", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("NUM", cell.getNumericCellValue()); + break; + default: + SP.put("NUM", ""); + } + break; + case 12: + switch (cell.getCellType()) { + case STRING: + SP.put("SPDJ", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("SPDJ", cell.getNumericCellValue()); + break; + default: + SP.put("SPDJ", ""); + } + break; + case 13: + switch (cell.getCellType()) { + case STRING: + SP.put("JE", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("JE", cell.getNumericCellValue()); + break; + default: + SP.put("JE", ""); + } + break; + case 14: + switch (cell.getCellType()) { + case STRING: + SP.put("SL", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("SL", cell.getNumericCellValue()); + break; + default: + SP.put("SL", ""); + } + break; + case 15: + switch (cell.getCellType()) { + case STRING: + SP.put("ZKJE", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("ZKJE", cell.getNumericCellValue()); + break; + default: + SP.put("ZKJE", ""); + } + break; + case 16: + switch (cell.getCellType()) { + case STRING: + SP.put("YHZCBS", cell.getStringCellValue()); + break; + case NUMERIC: + SP.put("YHZCBS", cell.getNumericCellValue()); + break; + default: + SP.put("YHZCBS", ""); + } + break; + } + } + if(StringUtil.isEmpty(jsonObject.getString("DDH"))){ + continue row; + } + SPS.add(SP); + jsonObject.put("SPS", SPS); + if (num == jsonArray.size()) { + jsonArray.add(jsonObject); + } else { + jsonArray.set(bj, jsonObject); + } + } + // 关闭工作簿 + workbook.close(); + file.close(); + return jsonArray; + } + + public JSONArray getFileContent(long fileId) throws IOException { + System.out.println("获取参数附件ID"+fileId); +// 附件路径 + String path = SystemEnvironment.getApplicationFolder()+"/hxinvoiceFile/"+fileId+"/"; + System.out.println("文件下载路径"+path); + List fileUrls = getAttachmentManager().getBySubReference(fileId); + Attachment attachment = getAttachmentManager().getAttachmentByFileURL(fileUrls.get(0)); + String filePath = path+attachment.getFilename(); + JSONArray jsonArray = getFileContent(filePath); + return jsonArray; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FormExportUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FormExportUtil.java new file mode 100644 index 0000000..c187dea --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FormExportUtil.java @@ -0,0 +1,65 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import com.seeyon.v3x.services.form.bean.RecordExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +//创建无流程表单数据处理工具类 +public class FormExportUtil { + + /** + * 设置主表信息 + * @param map 设置主表字段。Map<主表显示名称,主表数据> + * @return + */ + public List setFormValue(Map map ){ +// 创建返回值对象 + List valueExports = new ArrayList(); + ValueExport valueExport ; +// 获取参数信息(显示名称) + Set keys = map.keySet(); + if(keys.size()>0) { +// 对控件赋值 + for (String key : keys) { + if(map.get(key) != null ){ + valueExport = new ValueExport(); + valueExport.setDisplayName(key); + valueExport.setValue(map.get(key).toString()); + valueExports.add(valueExport); + } +// System.out.println(key+":"+map.get(key)); + } + } + return valueExports; + } + + /** + * 设置从表信息 + * @param lists 设置主表字段。List> + */ + public List setSubordinateFormValue(List> lists){ + List subordinateFormExports = new ArrayList(); + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List recordExports = new ArrayList(); + List valueExports; + RecordExport recordExport; + for(int i = 0 ; i < lists.size() ; i++) { + recordExport = new RecordExport(); + valueExports = setFormValue(lists.get(i)); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + + return subordinateFormExports; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FourDigitUniqueIdGenerator.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FourDigitUniqueIdGenerator.java new file mode 100644 index 0000000..d30b0cf --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/FourDigitUniqueIdGenerator.java @@ -0,0 +1,35 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import java.util.HashSet; +import java.util.Random; +import java.util.Set; + +public class FourDigitUniqueIdGenerator { + private static final int ID_LENGTH = 4; +// private static final String CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + private static final String CHARACTERS = "0123456789"; + private static final Random random = new Random(); + private static final Set generatedIds = new HashSet<>(); + + public static String generateId() { + String id; + do { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < ID_LENGTH; i++) { + int index = random.nextInt(CHARACTERS.length()); + sb.append(CHARACTERS.charAt(index)); + } + id = sb.toString(); + } while (generatedIds.contains(id)); + generatedIds.add(id); + return id; + } + + public static void main(String[] args) { + // 生成 10 个 4 位随机不重复值进行测试 + for (int i = 0; i < 100; i++) { + String uniqueId = generateId(); + System.out.println("Generated ID: " + uniqueId); + } + } +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/GzipUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/GzipUtils.java new file mode 100644 index 0000000..370fcfd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/GzipUtils.java @@ -0,0 +1,118 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import lombok.extern.slf4j.Slf4j; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +/** + * gzip压缩工具类 + * + * @author ZSC-DXHY + * @date 创建时间: 2020-08-14 15:03 + */ +@Slf4j +public class GzipUtils { + public static final int BUFFER = 1024; + public static final String EXT = ".gz"; + + /** + * 数据压缩 + * + * @param data + * @return + * @throws Exception + */ + public static byte[] compress(byte[] data) { + byte[] output = null; + try { + ByteArrayInputStream bais = new ByteArrayInputStream(data); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // 压缩 + compress(bais, baos); + output = baos.toByteArray(); + + baos.flush(); + baos.close(); + + bais.close(); + } catch (Exception e) { +// log.error("未知:" + e); +// System.out.println("未知:" + e); + } + return output; + } + + /** + * 数据压缩 + * + * @param is + * @param os + * @throws Exception + */ + public static void compress(InputStream is, OutputStream os) + throws Exception { + + GZIPOutputStream gos = new GZIPOutputStream(os); + + int count; + byte[] data = new byte[BUFFER]; + while ((count = is.read(data, 0, BUFFER)) != -1) { + gos.write(data, 0, count); + } + + gos.finish(); + + gos.flush(); + gos.close(); + } + + + /** + * 数据解压缩 + * + * @param data + * @return + * @throws Exception + */ + public static byte[] decompress(byte[] data) throws Exception { + ByteArrayInputStream bais = new ByteArrayInputStream(data); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // 解压缩 + decompress(bais, baos); + + data = baos.toByteArray(); + + baos.flush(); + baos.close(); + + bais.close(); + + return data; + } + + /** + * 数据解压缩 + * + * @param is + * @param os + * @throws Exception + */ + public static void decompress(InputStream is, OutputStream os) + throws Exception { + GZIPInputStream gis = new GZIPInputStream(is); + int count; + byte[] data = new byte[BUFFER]; + while ((count = gis.read(data, 0, BUFFER)) != -1) { + os.write(data, 0, count); + } + + gis.close(); + } + +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/HxinvoiceHttpUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/HxinvoiceHttpUtil.java new file mode 100644 index 0000000..9505651 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/HxinvoiceHttpUtil.java @@ -0,0 +1,48 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse; +import com.seeyon.ctp.util.json.JSONUtil; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class HxinvoiceHttpUtil { + + private HxinvoiceHttpUtil() { + + } + + public static String doPost(String url, String body) throws Exception { + + return HttpRequest.post(url).header("accept", "*/*") + .body(body).execute().body(); + } + + public static HxinvoiceResponse parseResponse(String response) throws Exception { + try { + JSONObject object = JSONUtil.parseJSONString(response, JSONObject.class); + return new HxinvoiceResponse(object); + } catch (Exception e) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("ZTDM", "0"); + jsonObject.put("ZTXX", "解析json异常"); + jsonObject.put("DDQQPCH", response); + return new HxinvoiceResponse(jsonObject); + } + } + + + + public static void main(String[] args) { + String url = ""; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/ParamUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/ParamUtil.java new file mode 100644 index 0000000..48df825 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/ParamUtil.java @@ -0,0 +1,812 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.src_hxinvoice.dao.IHxinvoiceDao; +import com.seeyon.apps.src_hxinvoice.dao.impl.HxinvoiceDaoImpl; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import www.seeyon.com.utils.StringUtil; + +import java.io.*; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class ParamUtil { + private static Log log = Log.get(ParamUtil.class); + + private EnumManager enumManagerNew; + public void setEnumManagerNew(EnumManager enumManagerNew) {this.enumManagerNew = enumManagerNew; } + public EnumManager getEnumManagerNew() { + if (enumManagerNew == null) {enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew");}return enumManagerNew; + } + + public String handleRequestParam(FormDataVo formDataVo, String request, String nodeId) throws NoSuchFieldException, IOException, BusinessException { + String param = request; + switch(nodeId){ + case "AddGenerateQdBdczlInvoiceNode": + param =handleRent(formDataVo,request); + param = paramMoneyInvoiceFormat(param); + break; + case "AddGenerateQdBdczlxzInvoiceNode": + param =signHandleRent(formDataVo,request); + param = paramMoneyInvoiceFormat(param); + break; + case "AddGenerateQdInvoiceNode": + param = addGenerateQdInvoiceParam(formDataVo,request); + if(param.contains("{")){ + param = paramMoneyInvoiceFormat(param); + } + break; + case "AddDanYiGenerateQdInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddDanYiGenerateQdBdczlInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddDanYiGenerateQdlkysfwInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddDanYiParkingFeeGenerateQdBdczlInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddGenerateQdHwysInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddReopenGenerateQdHwysInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddReopenGenerateQdcpyInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddReopenGenerateQdBdczlInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddReopenGenerateQdlkysfwInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddReopenParkingFeeGenerateQdBdczlInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddGenerateQdcpyInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddHongZIGenerateQdInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddReopenGenerateQdInvoiceNode": + param = paramMoneyInvoiceFormat(request); + break; + case "AddWuYeGenerateQdInvoiceNode": + param = handlePropertyManagementFee(formDataVo,request,"物业费税编"); + param = paramMoneyInvoiceFormat(param); + break; + case "AddWuYexinzengGenerateQdInvoiceNode": + param = handlePropertyManagementFee(formDataVo,request,"物业费税编"); + param = paramMoneyInvoiceFormat(param); + break; + case "AddShiChangGenerateQdInvoiceNode": + param = handlePropertyManagementFee(formDataVo,request,"市场费税编"); + param = paramMoneyInvoiceFormat(param); + break; + case "AddShiChangxinzengGenerateQdInvoiceNode": + param = handlePropertyManagementFee(formDataVo,request,"市场费税编"); + param = paramMoneyInvoiceFormat(param); + break; + } + return param; + } + + private String addGenerateQdInvoiceParam(FormDataVo formDataVo,String request) throws NoSuchFieldException, BusinessException, IOException { + log.info("进行附件处理"); + FileUtil fileUtil = new FileUtil(); + IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); +// 参数转JSON + JSONObject jsonObject = JSONObject.parseObject(request); +// 获取参数名称 + String DDZXXName = jsonObject.getString("DDZXX"); + log.info("获取参数附件ID"+DDZXXName); +// 根据参数名称获取附件控件对象 +// FieldDataVo DDZXXNameVo = formDataVo.getFieldData(DDZXXName); +// 获取附件控件ID +// String DDZXXValue = DDZXXNameVo.getStringValue(); +// 设置附件下载路径 + String path = SystemEnvironment.getApplicationFolder()+"/hxinvoiceFile/"+DDZXXName+"/"; + log.info("文件下载路径"+path); +// 将附件下载到服务器 + List filePaths = fileUtil.fieldFileDownload(Long.parseLong(DDZXXName),path); +// 开票人信息 + FieldDataVo kprvo = formDataVo.getFieldData("开票人"); + String kpr = kprvo.getStringValue(); + FieldDataVo shxmcvo = formDataVo.getFieldData("公司名称"); + String shxmc = shxmcvo.getStringValue(); + FieldDataVo xhfnsrsbhvo = formDataVo.getFieldData("销售方税号"); + String xhfnsrsbh = xhfnsrsbhvo.getStringValue(); +// 创建DDZXX对象 + JSONArray DDZXXS = new JSONArray(); + for(String filePath : filePaths){ + JSONArray jsonArray = fileUtil.getFileContent(filePath); + for(int i = 0 ; i < jsonArray.size();i++){ + double jshj = 0; + FieldDataVo ddqqlshvo = formDataVo.getFieldData("订单请求批次号"); + String ddqqlsh = ddqqlshvo.getStringValue(); + JSONObject DDZXX = new JSONObject(); + JSONObject param = jsonArray.getJSONObject(i); + JSONObject DDTXX = new JSONObject(); + DDTXX.put("GMFLX","01");//购买方类型 + + DDTXX.put("XHFSBH",xhfnsrsbh);//销货方纳税人识别号 + DDTXX.put("GMFDH",param.getString("GMFSJ"));//购买方联系方式 + + DDTXX.put("HJJE","0");//合计金额 + DDTXX.put("HJSE","0");//合计税额 + DDTXX.put("KPR",kpr);//开票人 +// DDTXX.put("DDQQLSH",ddqqlsh+"");//请求订单流水号。自定义 + DDTXX.put("DDQQLSH",ddqqlsh+"_"+param.getString("DDH")); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String timestamp = sdf.format(new Date()); + String uniqueId = FourDigitUniqueIdGenerator.generateId(); + FieldDataVo gsbhvo = formDataVo.getFieldData("公司编号"); + String gsbh = gsbhvo.getStringValue(); +// DDTXX.put("DDQQLSH","ZZKPPLDDH_"+gsbh+timestamp+uniqueId);//请求订单流水号。自定义 + if(StringUtil.isEmpty(param.getString("DDH"))){ + return "订单号为空,请检查上传附件数据"; + } + DDTXX.put("DDH","ZZKPPLDDH_"+gsbh+timestamp+uniqueId);//订单号 + DDTXX.put("GMFDZYX",param.getString("GMFYX"));//购买方邮箱地址 + DDTXX.put("SX_XTLY","SX_OA");//系统标识,固定为SX_OA + DDTXX.put("KPLX","0");//开票类型 + DDTXX.put("XHFMC",shxmc);//销货方名称 + DDTXX.put("GMFSJH",param.getString("GMFSJ"));//购买方联系方式 + DDTXX.put("BZ",param.getString("BZ"));//备注 + DDTXX.put("GMFMC",param.getString("GMFMC"));//购买方名称 + DDTXX.put("GMFDZ","");//购买方地址 + DDTXX.put("GMFSBH",param.getString("GMFNSRSBH"));//购买方税号 + DDTXX.put("SFZSGFDZDH","Y");//购方是否展示编码 + DDTXX.put("SFZSGFYHZH","Y");//购方是否展示编码 + DDTXX.put("SFZSXFDZDH","Y");//购方是否展示编码 + DDTXX.put("SFZSXFYHZH","Y");//购方是否展示编码 + DDTXX.put("GMFYH","");//购买方银行 + DDTXX.put("GMFZH","");//购买方银行账号 + + JSONArray SPS = param.getJSONArray("SPS"); + JSONArray DDMXXXS = new JSONArray(); + int bzkh = 0;int zkh = 0; + for(int n = 0 ; n < SPS.size();n++){ +// 遍历商品信息,折扣行和被折扣行数量是否相等 + JSONObject SP = SPS.getJSONObject(n); + String jestr = SP.getString("JE"); + double jedou = Double.parseDouble(jestr); + jshj = jshj+jedou; + JSONObject DDMXXX = new JSONObject(); + DDMXXX.put("SPSL",SP.getString("NUM"));//数量 + DDMXXX.put("HSBZ","1"); + if("折扣行".equals(SP.getString("FXHXZ"))){ + DDMXXX.put("FPHXZ","1");//发票行性质 + zkh++; + }else if ("被折扣行".equals(SP.getString("FXHXZ"))){ + DDMXXX.put("FPHXZ","2");//发票行性质 + bzkh++; + }else{ + DDMXXX.put("FPHXZ","0");//发票行性质 + } + + DDMXXX.put("SE","");//税额 + DDMXXX.put("YHZCBS","0");//优惠政策标识 + DDMXXX.put("DJ",SP.getString("SPDJ"));//单价 + String je = SP.getString("JE"); + double jedecimalValue = 0; + try { + NumberFormat format = NumberFormat.getInstance(Locale.US); // 使用美国格式(千分位是逗号) + Number number = format.parse(je); + jedecimalValue = number.doubleValue(); + } catch (ParseException e) { + log.info("解析失败: " + e.getMessage()); + } + DDMXXX.put("JE",jedecimalValue);//金额 + DDMXXX.put("SPID","");//商品ID + String spcode = SP.getString("SPBM"); + Map goods = hxinvoiceDao.getGoodsByCode(spcode); +// BigDecimal sl = (BigDecimal) goods.get("sl"); + DDMXXX.put("SL",SP.getString("SL"));//税率 + if(StringUtil.isNotEmpty(SP.getString("YHZCBS"))){ + DDMXXX.put("LSLBS","1");//增值税特殊管理 + DDMXXX.put("YHZCBS","1");//增值税特殊管理 + DDMXXX.put("ZZSTSGL","免税");//增值税特殊管理 + } +// else{ +// DDMXXX.put("LSLBS","");//增值税特殊管理 +// DDMXXX.put("YHZCBS","");//增值税特殊管理 +// DDMXXX.put("ZZSTSGL","");//增值税特殊管理 +// } +// DDMXXX.put("ZZSTSGL",goods.get("zzstsgl"));//增值税特殊管理 + DDMXXX.put("SPBM",spcode);//商品编码/税目编码 + DDMXXX.put("DW",SP.getString("DW"));//单位 + DDMXXX.put("GGXH",SP.getString("GGXH"));//规格 + DDMXXX.put("XMMC",SP.getString("XMMC"));//商品税目名称 + DDMXXXS.add(DDMXXX); + } +// 校验发票行标识 + if(zkh!=bzkh){ + return "订单号:"+param.getString("DDH")+",折扣行与被折扣行必须成对出现,请检查数据"; + } + DDZXX.put("DDMXXX",DDMXXXS); + DDTXX.put("JSHJ",jshj+"");//价税合计 + DDZXX.put("DDTXX",DDTXX); + DDZXXS.add(DDZXX); + } + } + jsonObject.put("DDZXX",DDZXXS); + return jsonObject.toString(); + } + + + /** + * 进行数字转化,转换为保留两位小数的文本 + * @param request + * @return + */ + private String paramMoneyInvoiceFormat(String request){ + JSONObject jsonObject = JSON.parseObject(request); + JSONArray DDZXXS = jsonObject.getJSONArray("DDZXX"); + if(DDZXXS==null){ + return request; + } + for(int i = 0 ; i < DDZXXS.size(); i++){ + JSONObject DDZXX = DDZXXS.getJSONObject(i); + JSONObject DDTXX = DDZXX.getJSONObject("DDTXX"); + if(DDTXX!=null){ + if (DDTXX.containsKey("JSHJ")) { + DDTXX.put("JSHJ",toDecimalFormat2(DDTXX.getString("JSHJ"))); + } + if (DDTXX.containsKey("HJJE")) { + DDTXX.put("HJJE",toDecimalFormat2(DDTXX.getString("HJJE"))); + } + if (DDTXX.containsKey("HJSE")) { + DDTXX.put("HJSE",toDecimalFormat2(DDTXX.getString("HJSE"))); + } + } + JSONObject QDTXX = DDZXX.getJSONObject("QDTXX"); + if(QDTXX != null){ + if (QDTXX.containsKey("CEZSLIST")) { + JSONArray CEZSLISTS = QDTXX.getJSONArray("CEZSLIST"); + if(CEZSLISTS!=null){ + for(int n = 0 ; n < CEZSLISTS.size() ; n ++){ + JSONObject CEZSLIST = CEZSLISTS.getJSONObject(n); + if(CEZSLIST!=null){ + if (CEZSLIST.containsKey("HJJE")) { + CEZSLIST.put("HJJE",toDecimalFormat2(CEZSLIST.getString("HJJE"))); + } + if (CEZSLIST.containsKey("KCE")) { + CEZSLIST.put("KCE",toDecimalFormat2(CEZSLIST.getString("KCE"))); + } + if (CEZSLIST.containsKey("BCKCJE")) { + CEZSLIST.put("BCKCJE",toDecimalFormat2(CEZSLIST.getString("BCKCJE"))); + } + if (CEZSLIST.containsKey("PZHJJE")) { + CEZSLIST.put("PZHJJE",toDecimalFormat2(CEZSLIST.getString("PZHJJE"))); + } + } + } + } + } + } + JSONArray DDMXXXS = DDZXX.getJSONArray("DDMXXX"); + if(DDMXXXS!=null){ + for(int n = 0 ; n < DDMXXXS.size() ; n++){ + JSONObject DDMXXX = DDMXXXS.getJSONObject(n); + if(DDMXXX!=null){ + if (DDMXXX.containsKey("DJ")) { + DDMXXX.put("DJ",toDecimalFormat6(DDMXXX.getString("DJ"))); + } + if (DDMXXX.containsKey("SPSL")) { + DDMXXX.put("SPSL",toDecimalFormat6(DDMXXX.getString("SPSL"))); + } + if (DDMXXX.containsKey("JE")) { + DDMXXX.put("JE",toDecimalFormat2(DDMXXX.getString("JE"))); + } + if (DDMXXX.containsKey("SE")) { + DDMXXX.put("SE",toDecimalFormat2(DDMXXX.getString("SE"))); + } + if (DDMXXX.containsKey("KCE")) { + DDMXXX.put("KCE",toDecimalFormat2(DDMXXX.getString("KCE"))); + } + } + } + } + } + String param = jsonObject.toString(); + return param; + } + + /** + * 创建租赁合同签订租金调用开票接口参数 + * @param formDataVo 表单数据 + * @param request 封装参数数据 + * @return + * @throws NoSuchFieldException + */ + private String signHandleRent(FormDataVo formDataVo,String request) throws NoSuchFieldException { + log.info("进行租赁合同签订不动产参数调整"); + JSONObject jsonObject = JSONObject.parseObject(request); +// 获取流水号,按照规则生成新的流水号 + JSONObject DDPCXX = jsonObject.getJSONObject("DDPCXX"); + DDPCXX.put("DDQQPCH","ZJQ"+DDPCXX.getString("DDQQPCH")); + jsonObject.put("DDPCXX",DDPCXX); +// 获取明细表数据 + String subTableName = jsonObject.getString("subTable"); + Map> subTables = formDataVo.getSubFormMap(); +// 获取指定明细表数据 + List subFormDataVos = subTables.get(subTableName); + JSONArray DDZXXs = new JSONArray(); +// 遍历明细表行数据 + for (FormDataVo subFormDataVo:subFormDataVos) { + JSONObject DDZXX = new JSONObject(); + JSONObject DDTXX = new JSONObject(); + FieldDataVo JSHJvo = subFormDataVo.getFieldData("已开票租金"); + String JSHJ = JSHJvo.getStringValue(); + if(isNumberNull(JSHJ)){ + continue; + } + DDTXX.put("JSHJ",JSHJ); + FieldDataVo BDCDZvo = formDataVo.getFieldData("不动产地址"); + String BDCDZ = BDCDZvo.getStringValue(); + FieldDataVo ZLQQZvo = subFormDataVo.getFieldData("租赁期起止"); + String ZLQQZ = ZLQQZvo.getStringValue(); + FieldDataVo KDSBZvo = formDataVo.getFieldData("跨地市标志"); + String KDSBZ = KDSBZvo.getStringValue(); + + FieldDataVo GMFLXvo = formDataVo.getFieldData("购买方类型编码"); + String GMFLX = GMFLXvo.getStringValue(); + DDTXX.put("GMFLX",GMFLX); + FieldDataVo XHFSBHvo = formDataVo.getFieldData("销售方纳税人识别号"); + String XHFSBH = XHFSBHvo.getStringValue(); + DDTXX.put("XHFSBH",XHFSBH); + DDTXX.put("GMFDH","");//购买方联系方式 + FieldDataVo KPRvo = formDataVo.getFieldData("开票人"); + String KPR = KPRvo.getStringValue(); + DDTXX.put("KPR",KPR); + FieldDataVo XHFYHvo = formDataVo.getFieldData("销货银行名称"); + String XHFYH = XHFYHvo.getStringValue(); + DDTXX.put("XHFYH",XHFYH); + FieldDataVo XHFZHvo = formDataVo.getFieldData("销货银行账号"); + String XHFZH = XHFZHvo.getStringValue(); + DDTXX.put("XHFZH",XHFZH); + FieldDataVo DDQQLSHvo = subFormDataVo.getFieldData("租金开票请求流水号"); + String DDQQLSH = DDQQLSHvo.getStringValue(); + DDTXX.put("DDQQLSH",DDQQLSH); + FieldDataVo GMFDZYXvo = formDataVo.getFieldData("购买方邮箱"); + String GMFDZYX = GMFDZYXvo.getStringValue(); + DDTXX.put("GMFDZYX",GMFDZYX); + DDTXX.put("SX_XTLY","SX_OA");//系统来源标识 + FieldDataVo KPLXvo = formDataVo.getFieldData("开票类型编码"); + String KPLX = KPLXvo.getStringValue(); + DDTXX.put("KPLX",KPLX); + FieldDataVo XHFMCvo = formDataVo.getFieldData("销售方名称"); + String XHFMC = XHFMCvo.getStringValue(); + DDTXX.put("XHFMC",XHFMC); + DDTXX.put("HJSE","0");//合计税额 + DDTXX.put("HJJE","0");//合计金额 + DDTXX.put("GMFSJH","");//购买方手机号 + FieldDataVo GMFMCvo = formDataVo.getFieldData("购买方名称"); + String GMFMC = GMFMCvo.getStringValue(); + DDTXX.put("GMFMC",GMFMC); + FieldDataVo GMFSBHvo = formDataVo.getFieldData("购买方纳税人识别号"); + String GMFSBH = GMFSBHvo.getStringValue(); + DDTXX.put("GMFSBH",GMFSBH); + + FieldDataVo GFSFZSvo = formDataVo.getFieldData("购方是否展示文本"); + String GFSFZS = GFSFZSvo.getStringValue(); + FieldDataVo XFSFZSvo = formDataVo.getFieldData("销方是否展示文本"); + String XFSFZS = XFSFZSvo.getStringValue(); + DDTXX.put("SFZSGFDZDH",GFSFZS); + DDTXX.put("SFZSGFYHZH",GFSFZS); + DDTXX.put("SFZSXFDZDH",XFSFZS); + DDTXX.put("SFZSXFYHZH",XFSFZS); + + DDTXX.put("DDH",DDQQLSH); +// 不动产地址:湖北省宜昌市伍家岗区东艳路48号; +// 租赁期起止:2025-01-01 2025-01-31;跨地(市)标志:否; + FieldDataVo BZvo = formDataVo.getFieldData("租金开票备注"); + String BZ = BZvo.getStringValue(); + DDTXX.put("BZ",BZ); + DDZXX.put("DDTXX",DDTXX); + JSONObject QDTXX = new JSONObject(); + JSONArray BDCZLXXLISTs = new JSONArray(); + JSONObject BDCZLXXLIST = new JSONObject(); + BDCZLXXLIST.put("XH","1"); + BDCZLXXLIST.put("ZLQQZ",ZLQQZ); + BDCZLXXLIST.put("KDSBZ",KDSBZ); + FieldDataVo MJDWvo = formDataVo.getFieldData("面积单位"); + String MJDW = MJDWvo.getStringValue(); + BDCZLXXLIST.put("MJDW",MJDW); + + BDCZLXXLIST.put("BDCDZ",BDCDZ); + FieldDataVo CQZSHvo = formDataVo.getFieldData("房屋产权证书号"); + String CQZSH = CQZSHvo.getStringValue(); + BDCZLXXLIST.put("CQZSH",CQZSH); + BDCZLXXLISTs.add(BDCZLXXLIST); + QDTXX.put("BDCZLXXLIST",BDCZLXXLISTs); + DDZXX.put("QDTXX",QDTXX); + + JSONArray DDMXXXs = new JSONArray(); + JSONObject DDMXXX = new JSONObject(); + DDMXXX.put("XH","1"); + FieldDataVo SLvo = formDataVo.getFieldData("租金税率"); + String SL = SLvo.getStringValue(); + DDMXXX.put("SL",SL); + DDMXXX.put("SPSL","1"); + DDMXXX.put("HSBZ","1"); + DDMXXX.put("SE",""); + FieldDataVo XMMCvo = formDataVo.getFieldData("租金项目名称"); + String XMMC = XMMCvo.getStringValue(); + if(StringUtil.isNotEmpty(XMMC)){ + DDMXXX.put("XMMC",XMMC); + }else{ + DDMXXX.put("XMMC","不动产租赁"); + } + DDMXXX.put("YHZCBS","0"); + DDMXXX.put("DJ",JSHJ); + DDMXXX.put("JE",JSHJ); + DDMXXX.put("SPID",""); + FieldDataVo SPBMvo = formDataVo.getFieldData("租金税编"); + String SPBM = SPBMvo.getStringValue(); + DDMXXX.put("SPBM",SPBM); + DDMXXX.put("FPHXZ","0"); + DDMXXXs.add(DDMXXX); + DDZXX.put("DDMXXX",DDMXXXs); + + DDZXXs.add(DDZXX); + } + jsonObject.remove("subTable"); + jsonObject.put("DDZXX",DDZXXs); + return jsonObject.toString(); + } + + + /** + * 创建租赁租金调用开票接口参数 + * @param formDataVo 表单数据 + * @param request 封装参数数据 + * @return + * @throws NoSuchFieldException + */ + private String handleRent(FormDataVo formDataVo,String request) throws NoSuchFieldException, BusinessException { + log.info("进行不动产参数调整"); + JSONObject jsonObject = JSONObject.parseObject(request); +// 获取流水号,按照规则生成新的流水号 + JSONObject DDPCXX = jsonObject.getJSONObject("DDPCXX"); + DDPCXX.put("DDQQPCH","ZJ"+DDPCXX.getString("DDQQPCH")); + jsonObject.put("DDPCXX",DDPCXX); + String subTableName = jsonObject.getString("subTable"); + Map> subTables = formDataVo.getSubFormMap(); + List subFormDataVos = subTables.get(subTableName); + JSONArray DDZXXs = new JSONArray(); + for (FormDataVo subFormDataVo:subFormDataVos) { + JSONObject DDZXX = new JSONObject(); + JSONObject DDTXX = new JSONObject(); + FieldDataVo JSHJvo = subFormDataVo.getFieldData("已开票租金"); + String JSHJ = JSHJvo.getStringValue(); + if(isNumberNull(JSHJ)){ + continue; + } + DDTXX.put("JSHJ",JSHJ); + FieldDataVo BDCDZvo = formDataVo.getFieldData("不动产地址"); + String BDCDZ = BDCDZvo.getStringValue(); + FieldDataVo ZLQQZvo = subFormDataVo.getFieldData("租赁期起止"); + String ZLQQZ = ZLQQZvo.getStringValue(); + FieldDataVo KDSBZvo = formDataVo.getFieldData("跨地市标志"); + String KDSBZ = KDSBZvo.getStringValue(); + + FieldDataVo GMFLXvo = formDataVo.getFieldData("购买方类型编码"); + String GMFLX = GMFLXvo.getStringValue(); + DDTXX.put("GMFLX",GMFLX); + FieldDataVo XHFSBHvo = formDataVo.getFieldData("销售方纳税人识别号"); + String XHFSBH = XHFSBHvo.getStringValue(); + DDTXX.put("XHFSBH",XHFSBH); + DDTXX.put("GMFDH","");//购买方联系方式 + + FieldDataVo KPRvo = formDataVo.getFieldData("开票人"); + String KPR = KPRvo.getStringValue(); + DDTXX.put("KPR",KPR); + FieldDataVo XHFYHvo = formDataVo.getFieldData("销货银行名称"); + String XHFYH = XHFYHvo.getStringValue(); + DDTXX.put("XHFYH",XHFYH); + FieldDataVo XHFZHvo = formDataVo.getFieldData("销货银行账号"); + String XHFZH = XHFZHvo.getStringValue(); + DDTXX.put("XHFZH",XHFZH); + FieldDataVo DDQQLSHvo = subFormDataVo.getFieldData("租金开票请求流水号"); + String DDQQLSH = DDQQLSHvo.getStringValue(); + DDTXX.put("DDQQLSH",DDQQLSH); + FieldDataVo GMFDZYXvo = formDataVo.getFieldData("购买方邮箱"); + String GMFDZYX = GMFDZYXvo.getStringValue(); + DDTXX.put("GMFDZYX",GMFDZYX); + DDTXX.put("SX_XTLY","SX_OA");//系统来源标识 + FieldDataVo KPLXvo = formDataVo.getFieldData("开票类型编码"); + String KPLX = KPLXvo.getStringValue(); + DDTXX.put("KPLX",KPLX); + FieldDataVo XHFMCvo = formDataVo.getFieldData("销售方名称"); + String XHFMC = XHFMCvo.getStringValue(); + DDTXX.put("XHFMC",XHFMC); + DDTXX.put("HJSE","0");//合计税额 + DDTXX.put("HJJE","0");//合计金额 + DDTXX.put("GMFSJH","");//购买方手机号 + FieldDataVo GMFMCvo = formDataVo.getFieldData("购买方名称"); + String GMFMC = GMFMCvo.getStringValue(); + DDTXX.put("GMFMC",GMFMC); + FieldDataVo GMFSBHvo = formDataVo.getFieldData("购买方纳税人识别号"); + String GMFSBH = GMFSBHvo.getStringValue(); + DDTXX.put("GMFSBH",GMFSBH); + + FieldDataVo GFSFZSvo = formDataVo.getFieldData("购方是否展示文本"); + String GFSFZS = GFSFZSvo.getStringValue(); + FieldDataVo XFSFZSvo = formDataVo.getFieldData("销方是否展示文本"); + String XFSFZS = XFSFZSvo.getStringValue(); + DDTXX.put("SFZSGFDZDH",GFSFZS); + DDTXX.put("SFZSGFYHZH",GFSFZS); + DDTXX.put("SFZSXFDZDH",XFSFZS); + DDTXX.put("SFZSXFYHZH",XFSFZS); + + DDTXX.put("DDH",DDQQLSH); +// 不动产地址:湖北省宜昌市伍家岗区东艳路48号; +// 租赁期起止:2025-01-01 2025-01-31;跨地(市)标志:否; + FieldDataVo BZvo = formDataVo.getFieldData("租金开票备注"); + String BZ = BZvo.getStringValue(); + DDTXX.put("BZ",BZ); + DDZXX.put("DDTXX",DDTXX); + JSONObject QDTXX = new JSONObject(); + JSONArray BDCZLXXLISTs = new JSONArray(); + JSONObject BDCZLXXLIST = new JSONObject(); + BDCZLXXLIST.put("XH","1"); + BDCZLXXLIST.put("ZLQQZ",ZLQQZ); + BDCZLXXLIST.put("KDSBZ",KDSBZ); + FieldDataVo MJDWvo = formDataVo.getFieldData("面积单位"); + String MJDW = MJDWvo.getStringValue(); + BDCZLXXLIST.put("MJDW",MJDW); + + BDCZLXXLIST.put("BDCDZ",BDCDZ); + FieldDataVo CQZSHvo = formDataVo.getFieldData("房屋产权证书号"); + String CQZSH = CQZSHvo.getStringValue(); + BDCZLXXLIST.put("CQZSH",CQZSH); + BDCZLXXLISTs.add(BDCZLXXLIST); + QDTXX.put("BDCZLXXLIST",BDCZLXXLISTs); + DDZXX.put("QDTXX",QDTXX); + + JSONArray DDMXXXs = new JSONArray(); + JSONObject DDMXXX = new JSONObject(); + DDMXXX.put("XH","1"); + FieldDataVo SLvo = formDataVo.getFieldData("租金税率"); + String SL = SLvo.getStringValue(); + DDMXXX.put("SL",SL); + DDMXXX.put("SPSL","1"); + DDMXXX.put("HSBZ","1"); + DDMXXX.put("SE",""); + FieldDataVo XMMCvo = formDataVo.getFieldData("租金项目名称"); + String XMMC = XMMCvo.getStringValue(); + if(StringUtil.isNotEmpty(XMMC)){ + DDMXXX.put("XMMC",XMMC); + }else{ + DDMXXX.put("XMMC","不动产租赁"); + } + DDMXXX.put("YHZCBS","0"); + DDMXXX.put("DJ",JSHJ); + DDMXXX.put("JE",JSHJ); + DDMXXX.put("SPID",""); + FieldDataVo SPBMvo = formDataVo.getFieldData("租金税编"); + String SPBM = SPBMvo.getStringValue(); + DDMXXX.put("SPBM",SPBM); + DDMXXX.put("FPHXZ","0"); + DDMXXXs.add(DDMXXX); + DDZXX.put("DDMXXX",DDMXXXs); + + DDZXXs.add(DDZXX); + } + jsonObject.remove("subTable"); + jsonObject.put("DDZXX",DDZXXs); + return jsonObject.toString(); + } + + + /** + * 市场费、物业费开票参数处理 + * @param formDataVo + * @param request + * @param spbmname + * @return + * @throws NoSuchFieldException + */ + private String handlePropertyManagementFee(FormDataVo formDataVo,String request,String spbmname) throws NoSuchFieldException { + IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); + JSONObject jsonObject = JSONObject.parseObject(request); + JSONObject DDPCXX = jsonObject.getJSONObject("DDPCXX"); +// 处理请求批次号 + if("市场费税编".equals(spbmname)){ + DDPCXX.put("DDQQPCH","SCQ"+DDPCXX.getString("DDQQPCH")); + }else if("物业费税编".equals(spbmname)){ + DDPCXX.put("DDQQPCH","WYQ"+DDPCXX.getString("DDQQPCH")); + } + jsonObject.put("DDPCXX",DDPCXX); + JSONArray DDZXXs = jsonObject.getJSONArray("DDZXX"); + JSONObject res = new JSONObject(); + res.put("DDPCXX",jsonObject.getJSONObject("DDPCXX")); + if(DDZXXs!=null){ + for(int i = 0 ; i < DDZXXs.size();i++){ + JSONObject DDZXX = DDZXXs.getJSONObject(i); + JSONArray DDMXXXs = DDZXX.getJSONArray("DDMXXX"); + JSONObject DDTXX = DDZXX.getJSONObject("DDTXX"); + JSONArray newDDZXXs = new JSONArray(); + for(int n = 0 ; n < DDMXXXs.size();n++){ + JSONObject DDMXXX = DDMXXXs.getJSONObject(n); + // 查询金额是否为空,不为空则记录订单参数 + if(isNumberNull(DDMXXX.getString("JE"))){ + continue; + } + JSONObject newDDZXX = new JSONObject(); + + JSONArray newDDMXXXs = new JSONArray(); + JSONObject toDDMXXX = new JSONObject(DDMXXX); + String DDMXXXstr = toDDMXXX.toString(); + JSONObject newDDMXXX = JSONObject.parseObject(DDMXXXstr); + FieldDataVo SPBMvo = formDataVo.getFieldData(spbmname); + String SPBM = SPBMvo.getStringValue(); + newDDMXXX.put("SPBM",SPBM);//获取税目编码 + Map good = hxinvoiceDao.getGoodsByCode(SPBM); + newDDMXXX.put("SL",good.get("sl").toString());//根据税目编码查询税率 + newDDMXXX.put("XH","1");//序号默认为1 + newDDMXXXs.add(newDDMXXX); + newDDZXX.put("DDMXXX",newDDMXXXs); + + JSONObject toDDTXX = new JSONObject(DDTXX); + String DDTXXstr = toDDTXX.toString(); + JSONObject newDDTXX = JSONObject.parseObject(DDTXXstr); + newDDTXX.put("JSHJ",DDMXXX.getString("JE"));//每行创建一条开票哦信息价税合计为明细表单个金额 + String DDQQLSH = DDTXX.getString("DDQQLSH"); +// String xh = DDMXXX.getString("XH"); +// String newDDQQLSH = ""; + // 处理流水号信息。凭借固定类型+流水号+序号 +// if("市场费税编".equals(spbmname)){ +// newDDQQLSH = "ZLSCKPPCH"+DDQQLSH+xh; +// }else if("物业费税编".equals(spbmname)){ +// newDDQQLSH = "ZLWYKPPCH"+DDQQLSH+xh; +// } + + newDDTXX.put("DDH",DDQQLSH); + newDDTXX.put("DDQQLSH",DDQQLSH); + newDDZXX.put("DDTXX",newDDTXX); + newDDZXXs.add(newDDZXX); + res.put("DDZXX",newDDZXXs); + } + } + } + return res.toString(); + } + + +// /** +// * 市场费、物业费开票参数处理 +// * @param formDataVo +// * @param request +// * @param spbmname +// * @return +// * @throws NoSuchFieldException +// */ +// private String handlePropertyManagementFee(FormDataVo formDataVo,String request,String spbmname) throws NoSuchFieldException { +// IHxinvoiceDao hxinvoiceDao = new HxinvoiceDaoImpl(); +// JSONObject jsonObject = JSONObject.parseObject(request); +// JSONObject DDPCXX = jsonObject.getJSONObject("DDPCXX"); +//// 处理请求批次号 +// if("市场费税编".equals(spbmname)){ +// DDPCXX.put("DDQQPCH","SCQ"+DDPCXX.getString("DDQQPCH")); +// }else if("物业费税编".equals(spbmname)){ +// DDPCXX.put("DDQQPCH","WYQ"+DDPCXX.getString("DDQQPCH")); +// } +// jsonObject.put("DDPCXX",DDPCXX); +// JSONArray DDZXXs = jsonObject.getJSONArray("DDZXX"); +// JSONObject res = new JSONObject(); +// res.put("DDPCXX",jsonObject.getJSONObject("DDPCXX")); +// if(DDZXXs!=null){ +// JSONObject DDZXX = DDZXXs.getJSONObject(0); +// JSONArray DDMXXXs = DDZXX.getJSONArray("DDMXXX"); +// JSONObject DDTXX = DDZXX.getJSONObject("DDTXX"); +// JSONArray newDDZXXs = new JSONArray(); +// for(int i = 0 ; i < DDMXXXs.size();i++){ +// JSONObject DDMXXX = DDMXXXs.getJSONObject(i); +// // 查询金额是否为空,不为空则记录订单参数 +// if(isNumberNull(DDMXXX.getString("JE"))){ +// continue; +// } +// JSONObject newDDZXX = new JSONObject(); +// +// JSONArray newDDMXXXs = new JSONArray(); +// JSONObject toDDMXXX = new JSONObject(DDMXXX); +// String DDMXXXstr = toDDMXXX.toString(); +// JSONObject newDDMXXX = JSONObject.parseObject(DDMXXXstr); +// FieldDataVo SPBMvo = formDataVo.getFieldData(spbmname); +// String SPBM = SPBMvo.getStringValue(); +// newDDMXXX.put("SPBM",SPBM);//获取税目编码 +// Map good = hxinvoiceDao.getGoodsByCode(SPBM); +// newDDMXXX.put("SL",good.get("sl").toString());//根据税目编码查询税率 +// newDDMXXX.put("XH","1");//序号默认为1 +// newDDMXXXs.add(newDDMXXX); +// newDDZXX.put("DDMXXX",newDDMXXXs); +// +// JSONObject toDDTXX = new JSONObject(DDTXX); +// String DDTXXstr = toDDTXX.toString(); +// JSONObject newDDTXX = JSONObject.parseObject(DDTXXstr); +// newDDTXX.put("JSHJ",DDMXXX.getString("JE"));//每行创建一条开票哦信息价税合计为明细表单个金额 +// String DDQQLSH = DDTXX.getString("DDQQLSH"); +// String xh = DDMXXX.getString("XH"); +// String newDDQQLSH = ""; +// // 处理流水号信息。凭借固定类型+流水号+序号 +// if("市场费税编".equals(spbmname)){ +// newDDQQLSH = "ZLSCKPPCH"+DDQQLSH+xh; +// }else if("物业费税编".equals(spbmname)){ +// newDDQQLSH = "ZLWYKPPCH"+DDQQLSH+xh; +// } +// +// newDDTXX.put("DDH",newDDQQLSH); +// newDDTXX.put("DDQQLSH",newDDQQLSH); +// newDDZXX.put("DDTXX",newDDTXX); +// newDDZXXs.add(newDDZXX); +// } +// res.put("DDZXX",newDDZXXs); +// } +// return res.toString(); +// } + + + public String toDecimalFormat2(String decimalFormat){ + String formattedNum = decimalFormat; + if(StringUtil.isNotEmpty(decimalFormat) && !"0".equals(formattedNum)){ + double num = Double.parseDouble(decimalFormat); + DecimalFormat df = new DecimalFormat("0.00"); + formattedNum = df.format(num); + } + return formattedNum; + } + public String toDecimalFormat4(String decimalFormat){ + String formattedNum = decimalFormat; + if(StringUtil.isNotEmpty(decimalFormat) && !"0".equals(formattedNum)){ + double num = Double.parseDouble(decimalFormat); + DecimalFormat df = new DecimalFormat("0.0000"); + formattedNum = df.format(num); + } + return formattedNum; + } + public String toDecimalFormat6(String decimalFormat){ + String formattedNum = decimalFormat; + if(StringUtil.isNotEmpty(decimalFormat) && !"0".equals(formattedNum)){ + double num = Double.parseDouble(decimalFormat); + DecimalFormat df = new DecimalFormat("0.000000"); + formattedNum = df.format(num); + } + return formattedNum; + } + + /** + * 判断文本是否为空或者为0 + * @param num + * @return + */ + public boolean isNumberNull(String num){ + boolean is = false; + if("0".equals(num) || StringUtil.isEmpty(num)){ + is = true; + } + return is; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/ProtUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/ProtUtil.java new file mode 100644 index 0000000..5b346bb --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/ProtUtil.java @@ -0,0 +1,371 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicHeader; +import org.apache.http.util.EntityUtils; +import www.seeyon.com.utils.StringUtil; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; + +public class ProtUtil { + public String getPluginId() {return HxinvoiceConstants.getPluginId();} + + public static String uploadFile(String targetUrl, String filePath) throws IOException { + String boundary = Long.toHexString(System.currentTimeMillis()); // 随机边界 + InputStream is = null; + BufferedReader br = null; + String result = null; + String CRLF = "\r\n"; // 换行符 + URL url = new URL(targetUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + connection.setDoOutput(true); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); + + try ( + OutputStream output = connection.getOutputStream(); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true); + ) { + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"title\"").append(CRLF); + writer.append(CRLF).append("测试11").append(CRLF).flush(); + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"fileType\"").append(CRLF); + writer.append(CRLF).append("pdf").append(CRLF).flush(); + // 发送文件数据 + File file = new File(filePath); + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(CRLF); + writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName())).append(CRLF); + writer.append(CRLF).flush(); + + Files.copy(file.toPath(), output); + output.flush(); // 确保文件数据发送完毕 + + writer.append(CRLF).flush(); // 结束行 + writer.append("--" + boundary + "--").append(CRLF); + } + + int responseCode = connection.getResponseCode(); + // 连接对象获取一个输入流,向远程读取 + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + System.out.println(result); + } + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + connection.disconnect(); + return result; + } + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public static JSONObject doPost(String str, String urlStr) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + URL url = new URL(urlStr); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", "application/json"); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + + } + + + public static void downloadFile(String urlStr, String filePath){ + String accesstoken = "T3KbU3zlRL"; + String appSecret = "owmMX93AfGZQBF2NCuH9a7i9TOeF5x"; + HttpURLConnection conn = null; + OutputStream out = null; + try { + + StringBuilder urlBuilder = new StringBuilder(urlStr); + + URL url = new URL(urlBuilder.toString()); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Host", url.getHost()); + conn.setRequestProperty("Accept", "text/plain,application/json"); + conn.setRequestProperty("User-Agent", "privateapp-java-api-client"); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setUseCaches(false); + + + int statusCode = conn.getResponseCode(); + StringBuilder response = new StringBuilder(); + if (statusCode == 200) { + try (InputStream ins = conn.getInputStream()){ + try (OutputStream outputStream = new FileOutputStream(filePath)) { + int bytesRead; + byte[] buffer = new byte[4096]; + while ((bytesRead = ins.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + //process response data + } catch (Exception e){ + // 处理异常情况 + } + } else { + // 处理异常情况 + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (conn != null) { + conn.disconnect(); + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + /** + * 获取一个token + * + * @return + * @throws IOException + * @throws FileNotFoundException + */ + private String getToken(String oatokenurl,String restName,String restPassword,String loginName) throws FileNotFoundException, IOException { + String address = oatokenurl + restName + "/" + restPassword; + if(StringUtil.isNotEmpty(loginName)){ + address = address +"?loginName="+loginName; + } + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(address); + // 添加 Headers 信息 + get.addHeader(new BasicHeader("Accept", "application/json")); + try { + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + String token = ""; + if(result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + token = jsObj.get("id").toString(); + }else { + token = result; + } + return token; + } + + + /** + * 调用post接口 + * @return + */ + public String sendPostNotification(String params, String urlParam, String token, ConfigVo configVo) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + + try { + String oatoken = getToken(configVo.getParamVal(HxinvoiceConstants.localipport.name())+configVo.getParamVal(HxinvoiceConstants.getTokenUrl.name()) + ,configVo.getParamVal(HxinvoiceConstants.localRestName.name()) + ,configVo.getParamVal(HxinvoiceConstants.localRestPwd.name()) + ,null); + URL url = new URL(configVo.getParamVal(HxinvoiceConstants.localipport.name())+urlParam+ token+"?token="+oatoken); + System.out.println(configVo.getParamVal(HxinvoiceConstants.localipport.name())+urlParam+ token+"?token="+oatoken); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", "application/json"); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + if (!("".equals(params) || params == null)) { + os.write(params.getBytes("UTF-8")); + } + System.out.println(connection.getResponseCode()); + // 连接对象获取一个输入流,向远程读取 + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); +// System.out.println(result); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } +// JSONObject json = JSONObject.parseObject(result); + return result; + + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/SXAESUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/SXAESUtil.java new file mode 100644 index 0000000..1c72e72 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/SXAESUtil.java @@ -0,0 +1,136 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.SecretKeySpec; +import java.math.BigInteger; + +public class SXAESUtil { + + //密钥 (需要前端和后端保持一致)测试 +// private static final String KEY = "a3AXVlct2w03CIVU"; + //密钥 (需要前端和后端保持一致)正式 + private static final String KEY = "5q5wwlSjezAiy7nx"; + //算法 + private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding"; + + /** + * aes解密 + * @param encrypt 内容 + * @return + * @throws Exception + */ + public static String aesDecrypt(String encrypt) { + try { + return aesDecrypt(encrypt, KEY); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + /** + * aes加密 + * @param content + * @return + * @throws Exception + */ + public static String aesEncrypt(String content) { + try { + return aesEncrypt(content, KEY); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + /** + * 将byte[]转为各种进制的字符串 + * @param bytes byte[] + * @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制 + * @return 转换后的字符串 + */ + public static String binary(byte[] bytes, int radix){ + return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数 + } + + /** + * base 64 encode + * @param bytes 待编码的byte[] + * @return 编码后的base 64 code + */ + public static String base64Encode(byte[] bytes){ + return Base64.encodeBase64String(bytes); + } + + /** + * base 64 decode + * @param base64Code 待解码的base 64 code + * @return 解码后的byte[] + * @throws Exception + */ + public static byte[] base64Decode(String base64Code) throws Exception{ + return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code); + } + + + /** + * AES加密 + * @param content 待加密的内容 + * @param encryptKey 加密密钥 + * @return 加密后的byte[] + * @throws Exception + */ + public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception { + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + kgen.init(128); + Cipher cipher = Cipher.getInstance(ALGORITHMSTR); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES")); + + return cipher.doFinal(content.getBytes("utf-8")); + } + + + /** + * AES加密为base 64 code + * @param content 待加密的内容 + * @param encryptKey 加密密钥 + * @return 加密后的base 64 code + * @throws Exception + */ + public static String aesEncrypt(String content, String encryptKey) throws Exception { + return base64Encode(aesEncryptToBytes(content, encryptKey)); + } + + /** + * AES解密 + * @param encryptBytes 待解密的byte[] + * @param decryptKey 解密密钥 + * @return 解密后的String + * @throws Exception + */ + public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception { + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + kgen.init(128); + Cipher cipher = Cipher.getInstance(ALGORITHMSTR); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES")); + byte[] decryptBytes = cipher.doFinal(encryptBytes); + return new String(decryptBytes); + } + + + /** + * 将base 64 code AES解密 + * @param encryptStr 待解密的base 64 code + * @param decryptKey 解密密钥 + * @return 解密后的string + * @throws Exception + */ + public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception { + return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/TripleDesUtil.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/TripleDesUtil.java new file mode 100644 index 0000000..6c2eb77 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/util/TripleDesUtil.java @@ -0,0 +1,66 @@ +package com.seeyon.apps.src_hxinvoice.util; + +import lombok.extern.slf4j.Slf4j; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; + +/** + * 3DES加解密工具类 + * + * @author ZSC-DXHY + * @date 创建时间: 2020-08-14 15:45 + */ +@Slf4j +public class TripleDesUtil { + private static final String LOGGER_MSG = "(3DES解密)"; + + /** + * 定义 加密算法,可用 DES,DESede,Blowfish + */ + private static final String ALGORITHM = "DESede"; + + /** + * 加密算法 + * password为加密密钥,长度24字节 + * src为被加密的数据缓冲区 + */ + public static byte[] encryptMode(String password, byte[] src) { + try { + //生成密钥 + SecretKey deskey = new SecretKeySpec(password.getBytes(StandardCharsets.UTF_8), ALGORITHM); + //加密 + Cipher c1 = Cipher.getInstance(ALGORITHM); + c1.init(Cipher.ENCRYPT_MODE, deskey); + return c1.doFinal(src); + } catch (Exception e1) { +// log.error("{}3DES加密异常:{}", LOGGER_MSG, e1); + System.out.println("{}3DES加密异常:{}"+e1 ); + } + return null; + } + + + /** + * 解密算法 + * password为解密密钥,长度24字节 + * src为被加密的数据缓冲区 + */ + public static byte[] decryptMode(String password, byte[] src) { + try { + //生成密钥 + SecretKey deskey = new SecretKeySpec(password.getBytes(StandardCharsets.UTF_8), ALGORITHM); + //解密 + Cipher c1 = Cipher.getInstance(ALGORITHM); + c1.init(Cipher.DECRYPT_MODE, deskey); + return c1.doFinal(src); + } catch (Exception e2) { +// log.error("{}3DES解密异常:{}", LOGGER_MSG, e2); + System.out.println("{}3DES解密异常:{}"+e2); + } + return null; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/vo/HxinvoiceResponse.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/vo/HxinvoiceResponse.java new file mode 100644 index 0000000..0a8de82 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_hxinvoice/vo/HxinvoiceResponse.java @@ -0,0 +1,108 @@ +package com.seeyon.apps.src_hxinvoice.vo; + +import com.alibaba.fastjson.JSONObject; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/4/28 + */ +public class HxinvoiceResponse { + + private boolean success; + private int status; + private String msg; + private String data; +// {"DDQQPCH”:"10001","ZTDM":"029999","ZTXX”:"订单处理失败”} +// {"DDQQPCH”:"10001",“ZTDM”:"010000”,“ZTXX”:"发票请求接收成功”} + public HxinvoiceResponse(JSONObject object) { + if(object.containsKey("ZTDM")) { + this.status = object.getString("ZTDM").equals("010000")?1:2; + } else { + this.status = object.getString("ZTDM").equals("000000")?1:2; + } + this.success = (1 == status); + if(object.containsKey("ZTXX")) { + this.msg = object.getString("ZTXX"); + } else { + this.msg = object.getString("ZTXX"); + } + if(object.containsKey("DDQQPCH")) { + this.data = object.getString("DDQQPCH"); + } else { + this.data = object.toString(); + } + } + + public HxinvoiceResponse(JSONObject object,String type) { + if("/sims-api/invoice/api/v6/OrderToFastRedInvoice".equals(type)){ + if(object.containsKey("ZTDM")) { + this.status = object.getString("ZTDM").equals("000000")?1:2; + } else { + this.status = object.getString("ZTDM").equals("000000")?1:2; + } + this.success = (1 == status); + if(object.containsKey("ZTXX")) { + this.msg = object.getString("ZTXX"); + } else { + this.msg = object.getString("ZTXX"); + } + this.data = object.toString(); + }else if("/sims-api/invoice/api/v6/QueryFastRedInvoiceResult".equals(type)){ + if(object.containsKey("ZTDM")) { + this.status = object.getString("ZTDM").equals("000000")?1:2; + } else { + this.status = object.getString("ZTDM").equals("000000")?1:2; + } + this.success = (1 == status); + if(object.containsKey("ZTXX")) { + this.msg = object.getString("ZTXX"); + } else { + this.msg = object.getString("ZTXX"); + } + this.data = object.toString(); + } + + + } + + public boolean isSuccess() { + return success; + } + + public HxinvoiceResponse setSuccess(boolean success) { + this.success = success; + return this; + } + + public int getStatus() { + return status; + } + + public HxinvoiceResponse setStatus(int status) { + this.status = status; + return this; + } + + public String getMsg() { + return msg; + } + + public HxinvoiceResponse setMsg(String msg) { + this.msg = msg; + return this; + } + + public String getData() { + return data; + } + + public HxinvoiceResponse setData(String data) { + this.data = data; + return this; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/dao/IOrdinaryDao.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/dao/IOrdinaryDao.java new file mode 100644 index 0000000..8e0209d --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/dao/IOrdinaryDao.java @@ -0,0 +1,11 @@ +package com.seeyon.apps.src_ordinary.dao; + +import java.util.List; + +public interface IOrdinaryDao { + + public List getOrdinaryCodes(String unitCode); + + public int updateOrdinaryCodes(String contractCodes,String oanum); + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/dao/OrdinaryDaoImpl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/dao/OrdinaryDaoImpl.java new file mode 100644 index 0000000..c569ece --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/dao/OrdinaryDaoImpl.java @@ -0,0 +1,86 @@ +package com.seeyon.apps.src_ordinary.dao; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; + +public class OrdinaryDaoImpl implements IOrdinaryDao{ + + private static final Log log = LogFactory.getLog(OrdinaryDaoImpl.class); + + private String getOrdinaryCodes = "select field0249 as CONTRACTCODE from formmain_3757 where field0249 like ? "; +// private String getOrdinaryCodes = "select field0249 as CONTRACTCODE from formmain_3738 where field0249 like ? "; +// private String getOrdinaryCodes = "select field0221 from formmain_0037 where field0221 like ? "; + + private String updateOrdinaryCodes = "update formmain_3757 set field0249 = ? where field0115 = ?"; +// private String updateOrdinaryCodes = "update formmain_3738 set field0249 = ? where field0115 = ?"; + + @Override + public List getOrdinaryCodes(String unitCode) { + JDBCAgent agent = new JDBCAgent(); + List contractCodes = new ArrayList(); + try { + StringBuilder sql = new StringBuilder(getOrdinaryCodes); + List p = new ArrayList(); + p.add(unitCode+"%"); + System.out.println(sql); + System.out.println(unitCode); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + System.out.println(list); + if(list.size()>0) { + for (Map map : list) { + System.out.println(map); + String contractSerial = map.get("contractcode").toString(). + substring(map.get("contractcode").toString().length()-3); + contractCodes.add(contractSerial); + } + } + } catch (BusinessException e) { + log.info(e); + e.printStackTrace(); + } catch (SQLException e) { + log.info(e); + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return contractCodes; + } + + @Override + public int updateOrdinaryCodes(String contractCodes,String oanum) { + JDBCAgent agent = new JDBCAgent(); + int i = 0; + try { + StringBuilder sql = new StringBuilder(updateOrdinaryCodes); + List p = new ArrayList(); + p.add(contractCodes); + p.add(oanum); + agent.execute(sql.toString(), p); +// List list = agent.resultSetToList(); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return i; + } + + + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/fieldCtrl/OrdinaryFieldCtrl.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/fieldCtrl/OrdinaryFieldCtrl.java new file mode 100644 index 0000000..a17d159 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/fieldCtrl/OrdinaryFieldCtrl.java @@ -0,0 +1,98 @@ +package com.seeyon.apps.src_ordinary.fieldCtrl; + +import java.util.List; + +import com.seeyon.cap4.form.bean.ParamDefinition; +import com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl; +import com.seeyon.cap4.form.util.Enums.ParamType; + +import www.seeyon.com.utils.UUIDUtil; + +/** + *
+ * 自定义控件:调用接口
+ * 
+ */ +public class OrdinaryFieldCtrl extends FormFieldCustomCtrl { + + /** + * UUIDLong.longUUID() + * UUIDUtil.getUUIDString() + */ + public String getKey() { + return "6903530450190094319"; + } + + public static void main(String[] args) { + System.out.println(UUIDUtil.getUUIDLong()); + } + + public String getFieldLength() { + return "20"; + } + + /** + * 控件初始化接口,此接口在控件初始化的时候,会调用,主要用于定义控件所属插件id、在表单编辑器中的图标、表单编辑器中有哪些属性可以设置。 + * 使用举例:在接口中定义自定义控件在在表单编辑器中有哪些控件属性需要配置 + */ + public void init() { + setPluginId("ordinary"); + setIcon("cap-icon-querystatistics"); + // 自定义参数 + ParamDefinition templateIdParam = new ParamDefinition(); + templateIdParam.setParamType(ParamType.button); + addDefinition(templateIdParam); + } + + /** (non-Javadoc) + * @see com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl#getPCInjectionInfo() + * PC端的资源文件路径 + */ + public String getPCInjectionInfo() { + return "{path:'apps_res/cap/customCtrlResources/ordinaryResources/',jsUri:'js/openUnflow.js',initMethod:'init',nameSpace:'field_" + getKey() + "'}"; + } + + + /** + * 获取移动端自定义控件运行态资源注入信息 + * path:'http://'+m3应用包mainifest.json中的urlSchemes的值+'v'+m3应用包mainifest.json中的version的值 + * weixinpath: 微信端打开的时候使用的m3/apps/v5/自定义控件移动端资源目录名称/,weixinpath配置的就是此自定义控件移动端资源目录名称 + * jsUri:移动端表单运行态加载第三方JavaScript的路径 + * initMethod:定义M3端表单运行态第三方js入口方法名称 + * * nameSpace:定义M3端表单运行态命名空间 + * + * @return + */ + + /** (non-Javadoc) + * @see com.seeyon.cap4.form.bean.fieldCtrl.FormFieldCustomCtrl#getMBInjectionInfo() + * 移动端的资源地址 + */ + public String getMBInjectionInfo() { + return "{path:'http://ordinary.v5.cmp/v1.0.0/',weixinpath:'ordinary',jsUri:'js/ordinary.js',initMethod:'init',nameSpace:'field_" + this.getKey() + "'}"; + } + + public String getText() { + return "合同编号生成按钮"; + } + + public boolean canBathUpdate() { + return false; + } + + public List getListShowDefaultVal(Integer externalType) { + return null; + } + + /** + * 初始值生成接口 + */ + public String[] getDefaultVal(String defaultValue) { + return new String[0]; + } + + public boolean canInjectionWord() { + return false; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/kit/A8FolderKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/kit/A8FolderKit.java new file mode 100644 index 0000000..c4bddb9 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/kit/A8FolderKit.java @@ -0,0 +1,26 @@ +package com.seeyon.apps.src_ordinary.kit; + +import com.seeyon.ctp.common.SystemEnvironment; + +/** + * Description + *
获取A8产品下面的文件夹路径
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class A8FolderKit { + + private static String SH_PROP = ""; + + /** + * Description: + *
获取到A8的安装应用目录  seeyon
+ * @return + */ + public static String getPropFile() { + if("".equals(SH_PROP)) { + SH_PROP = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_delivery/kuaidi100.properties"; + } + return SH_PROP; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/kit/PropKit.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/kit/PropKit.java new file mode 100644 index 0000000..dc41398 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/kit/PropKit.java @@ -0,0 +1,57 @@ +package com.seeyon.apps.src_ordinary.kit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 读取参数 + */ + +public class PropKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + public static final String PROFILE = "profile"; + + public static final String DELIVERYURL = "deliveryUrl"; + + public static final String PROD_DELIVERYURL = "prod.deliveryUrl"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(A8FolderKit.getPropFile()); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + String profile = prop.getProperty(PROFILE); + if("prod".equals(profile)) { + props.put(DELIVERYURL, prop.getProperty(PROD_DELIVERYURL)); + } else { + props.put(DELIVERYURL, prop.getProperty(PROD_DELIVERYURL)); + } + } + return props.get(key); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/servlet/OrdinaryCodeServlet.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/servlet/OrdinaryCodeServlet.java new file mode 100644 index 0000000..b98f9db --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_ordinary/servlet/OrdinaryCodeServlet.java @@ -0,0 +1,155 @@ +package com.seeyon.apps.src_ordinary.servlet; + +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_ordinary.dao.IOrdinaryDao; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import jodd.util.StringUtil; + +public class OrdinaryCodeServlet extends HttpServlet{ + + private volatile boolean running; + + private IOrdinaryDao ordinaryDao; + public void setOrdinaryDao(IOrdinaryDao ordinaryDao) { + this.ordinaryDao = ordinaryDao; + } + public IOrdinaryDao getOrdinaryDao() { + if (this.ordinaryDao == null) { + this.ordinaryDao = ((IOrdinaryDao)AppContext.getBean("ordinaryDao")); + } + return ordinaryDao; + } + + private OrgManagerDirect orgManagerDirect; + + public OrgManagerDirect getOrgManagerDirect() { + if (this.orgManagerDirect == null) { + this.orgManagerDirect = ((OrgManagerDirect)AppContext.getBean("orgManagerDirect")); + } + return orgManagerDirect; + } + + public void setOrgManagerDirect(OrgManagerDirect orgManagerDirect) { + this.orgManagerDirect = orgManagerDirect; + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException{ +// 获取请求参数 + ServletOutputStream servletout = response.getOutputStream(); + InputStream servletin = request.getInputStream(); + byte[] bytes = new byte[request.getContentLength()]; + System.out.println(request.getContentLength()); + String dataid = request.getParameter("dataid"); + String unitCode = request.getParameter("unitCode"); + String oanum = request.getParameter("oanum"); + servletin.read(bytes); +// 将钉钉传递的参数转换成String格式 + String str = new String(bytes, "utf-8"); + System.out.println(str); + String[] strs = str.split("&"); +// 将String转换成json + Map paramMap = new HashMap(); + for(int i = 0 ; i < strs.length ; i++) { + String[] param = strs[i].split("="); + if(param.length != 1 ) { + paramMap.put(param[0], param[1]); + } + } + Date date = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); + String datestr = sdf.format(date); + + if(StringUtil.isEmpty(unitCode)){ + unitCode = paramMap.get("unitCode").toString(); + } + if(StringUtil.isEmpty(oanum)){ + oanum = paramMap.get("oanum").toString(); + } + +// String unitCode = paramMap.get("unitCode").toString(); +// String oanum = paramMap.get("oanum").toString(); +// unitCode = unitCode+datestr.substring(0,6); + unitCode = unitCode+"_"+datestr; + if(running) { + System.out.println("业务繁忙,重新生成"); + Map map = new HashMap<>(); + map.put("isSucceed", "500"); + map.put("msg","业务繁忙,请重新生成"); +// r = false; + String s = JSONObject.toJSONString(map); +// 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + return ; + } + try { + running = true; + List contractCodes = getOrdinaryDao().getOrdinaryCodes(unitCode); + String code = ""; + if(contractCodes.size()>0) { + for(int i = 1 ;i <1000;i++) { + String sum = String.format("%03d", i); + if(!contractCodes.contains(sum)) { + code = unitCode+sum; + break; + } + } + }else { + // 当前没有查询到此公司下存在合同编号生成合同编号001 + code = unitCode+"001"; + } + // 变更数据库编码信息 + int contractsize = getOrdinaryDao().updateOrdinaryCodes(code,oanum); + Map map = new HashMap<>(); + if(contractsize==1) { + System.out.println("生成成功"+code); + map.put("isSucceed", "200"); + map.put("newCode",code); + }else { + map.put("isSucceed", "500"); + map.put("msg","生成失败,请在合同核定时生成合同编号。"); + } + String s = JSONObject.toJSONString(map); + // 将验证信息回传给钉钉进行校验 + byte[] buf = s.getBytes("UTF-8"); + servletout.write(buf); + servletout.flush(); + servletout.close(); + }catch(Exception e){ + System.out.println(e); + }finally { + this.running = false; + } + } + + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ + doGet(request,response); + } + + + public void init() throws ServletException { } + + public void destroy() { + super.destroy(); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/PowerFeeInvoicePluginApi.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/PowerFeeInvoicePluginApi.java new file mode 100644 index 0000000..eaf2f5b --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/PowerFeeInvoicePluginApi.java @@ -0,0 +1,43 @@ +package com.seeyon.apps.src_powerfeeinvoice; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_powerfeeinvoice.constants.PowerFeeInvoiceConstants; + +public class PowerFeeInvoicePluginApi extends APluginInfoApi { + public PowerFeeInvoicePluginApi() { + } + + public String getPluginId() { + System.out.println(PowerFeeInvoiceConstants.getPluginId()); + return PowerFeeInvoiceConstants.getPluginId(); + } + + public String getCreateUser() { + return "橙阳科技"; + } + + public String getDescription() { + return "三峡旅游水电费开票"; + } + + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + PowerFeeInvoiceConstants[] var2 = PowerFeeInvoiceConstants.values(); + int var3 = var2.length; + + for(int var4 = 0; var4 < var3; ++var4) { + PowerFeeInvoiceConstants value = var2[var4]; + if (value != PowerFeeInvoiceConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + + return configVo; + } + +} + diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/config/HttpFormRestApiConfig.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/config/HttpFormRestApiConfig.java new file mode 100644 index 0000000..c905204 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/config/HttpFormRestApiConfig.java @@ -0,0 +1,49 @@ +package com.seeyon.apps.src_powerfeeinvoice.config; + +public class HttpFormRestApiConfig { + private String restUserName; + private String restPwd; + private String baseUrl; + private String tokenUrl; + private String rightId; + + public String getRestPwd() { + return restPwd; + } + + public void setRestPwd(String restPwd) { + this.restPwd = restPwd; + } + + public String getRestUserName() { + return restUserName; + } + + public void setRestUserName(String restUserName) { + this.restUserName = restUserName; + } + + public String getBaseUrl() { + return baseUrl; + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + + public String getTokenUrl() { + return tokenUrl; + } + + public void setTokenUrl(String tokenUrl) { + this.tokenUrl = tokenUrl; + } + + public String getRightId() { + return rightId; + } + + public void setRightId(String rightId) { + this.rightId = rightId; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/config/PowerFeePluginConfigProvider.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/config/PowerFeePluginConfigProvider.java new file mode 100644 index 0000000..b274d6c --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/config/PowerFeePluginConfigProvider.java @@ -0,0 +1,18 @@ +package com.seeyon.apps.src_powerfeeinvoice.config; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.src_powerfeeinvoice.constants.PowerFeeInvoiceConstants; +import com.seeyon.ctp.common.AppContext; + +import static com.seeyon.apps.src_powerfeeinvoice.constants.PowerFeeInvoiceConstants.getPluginId; + + +public class PowerFeePluginConfigProvider { + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + public String getBizConfigByKey(PowerFeeInvoiceConstants key) { + ConfigVo config = cstConfigApi.getConfig(getPluginId()); + return config.getParamVal(key.name()); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/constants/PowerFeeInvoiceConstants.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/constants/PowerFeeInvoiceConstants.java new file mode 100644 index 0000000..80d07d5 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/constants/PowerFeeInvoiceConstants.java @@ -0,0 +1,35 @@ +package com.seeyon.apps.src_powerfeeinvoice.constants; + +public enum PowerFeeInvoiceConstants { + + plugin("src_powerfeeinvoice","插件ID"), + hxSecretKey("","航信密钥key"), + hxSecretId("","航信密钥id"), + hxPushInvoiceUrl("","航信推送发票地址"), + formNo("","表单编号"), + DAORGFORMNO("","DA-ORG公司信息底表编号"), + KPRDAFORMNO("","开票人信息表单编号"), + invoiceFormNo("","开票档案表表单编号"), + formInsertLoginName("","表单插入登录名"), + dfRightId("","电费表操作rightId"); + ; + + private String defaultValue; + private String description; + + PowerFeeInvoiceConstants(String defaultValue,String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + public String getDescription() { + return description; + } + + public String getDefaultValue() { + return defaultValue; + } + public static String getPluginId() { + return plugin.defaultValue; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/job/PowerFeePushJob.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/job/PowerFeePushJob.java new file mode 100644 index 0000000..f058cb1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/job/PowerFeePushJob.java @@ -0,0 +1,240 @@ +package com.seeyon.apps.src_powerfeeinvoice.job; + +import cn.hutool.log.Log; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.src_hxinvoice.constants.HxinvoiceConstants; +import com.seeyon.apps.src_powerfeeinvoice.config.HttpFormRestApiConfig; +import com.seeyon.apps.src_powerfeeinvoice.config.PowerFeePluginConfigProvider; +import com.seeyon.apps.src_powerfeeinvoice.constants.PowerFeeInvoiceConstants; +import com.seeyon.apps.src_powerfeeinvoice.service.HxInvoiceInfoFillService; +import com.seeyon.apps.src_powerfeeinvoice.service.PowerFeeService; +import com.seeyon.apps.src_powerfeeinvoice.utils.ClauseFactor; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormColumn; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormDataOperator; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormFieldVo; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormWhereCondition; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormUpdateField; +import com.seeyon.apps.src_powerfeeinvoice.vo.PowerFeeInvoiceInfo; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import org.springframework.beans.factory.annotation.Autowired; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PowerFeePushJob extends AbstractQuartzTask { + + private static Log log = Log.get(PowerFeePushJob.class); + @Autowired + private PowerFeeService powerFeeService; + private PowerFeePluginConfigProvider powerFeePluginConfigProvider = (PowerFeePluginConfigProvider) AppContext.getBean("powerFeePluginConfigProvider"); + + @Override + public String taskRun(String s) throws Exception { + if(s == null) { + s = new String("2025-03-01"); + } + try { + List conditions = new ArrayList<>(); + HxInvoiceInfoFillService fillService = new HxInvoiceInfoFillService(); + String secretKey = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.hxSecretKey); + String secretId = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.hxSecretId); + String url = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.hxPushInvoiceUrl); + String formNo = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.formNo); +// conditions.add(FormQueryCondition.build().value("2025-01-01").clauseFactor(ClauseFactor.GE).display("支付日期")); + conditions.add(FormWhereCondition.build().value(s).clauseFactor(ClauseFactor.GT).display("支付日期").index("TO_DATE(?,'YYYY-MM-DD')")); + conditions.add(FormWhereCondition.build().clauseFactor(ClauseFactor.NULL).concatFactor(ClauseFactor.OR).startWithBracket(true).display("是否推送开票系统")); + conditions.add(FormWhereCondition.build().value("否").clauseFactor(ClauseFactor.EQ).endWithBracket(true).display("是否推送开票系统")); + conditions.add(FormWhereCondition.build().clauseFactor(ClauseFactor.NULL).concatFactor(ClauseFactor.OR).startWithBracket(true).display("是否已开票")); + conditions.add(FormWhereCondition.build().value("否").clauseFactor(ClauseFactor.EQ).endWithBracket(true).display("是否已开票")); + List columns = powerFeeService.queryCondition(powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.formNo), null,conditions ); + PowerFeeInvoiceInfo invoiceInfo = null; + if(columns != null && columns.size() > 0) { + for (FormColumn column : columns) { + try { + invoiceInfo = new PowerFeeInvoiceInfo(); + String formId = column.getId(); + if(column.getVos() == null) { + continue; + } + Map sellerInfo = null; + Map invoicerInfo = null; + for (FormFieldVo vo : column.getVos()) { + if(vo.getDisplayName().equals("BIP公司编号")) { + sellerInfo = getSellerInfo(vo); + } + if(vo.getDisplayName().equals("OA一级公司")) { + invoicerInfo = getInvoicerInfo(vo); + } + fillInfo(vo,invoiceInfo); + } + //填充销方信息 + invoiceInfo.setSellerName(sellerInfo.get("销售方名称")); + invoiceInfo.setSellerTaxNo(sellerInfo.get("销售方税号")); + invoiceInfo.setInvoicer(invoicerInfo.get("开票人")); + String ddqqlsh = "ZNDBLSH" + System.currentTimeMillis(); + invoiceInfo.setOrderTradeNo(ddqqlsh); + if(invoiceInfo.getTotalPrice() != null) { + BigDecimal bigDecimal = new BigDecimal(invoiceInfo.getTotalPrice() + ""); + if(bigDecimal.compareTo(BigDecimal.ZERO) == -1) { + throw new RuntimeException("金额为负数"); + } + } + String param = fillService.getParam(invoiceInfo); + if(invoiceInfo.getBuyer() == null || + invoiceInfo.getSellerName() == null || + invoiceInfo.getSellerTaxNo() == null || + invoiceInfo.getTotalPrice() == null || + invoiceInfo.getPrice() == null || + invoiceInfo.getBuyerPhone() == null || + invoiceInfo.getOrderTradeNo() == null) { + throw new RuntimeException("某些必传参数为空,请检查金额、单价、手机号、订单请求流水号、纳税识别号等信息"); + } + + fillService.pushInvoiceInfo(param,secretKey,secretId,url); + List updateFiels = new ArrayList<>(); + updateFiels.add(FormUpdateField.build().display("是否推送开票系统").value("是")); + updateFiels.add(FormUpdateField.build().display("订单请求流水号").value(ddqqlsh)); + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId)).clauseFactor(ClauseFactor.EQ)); + powerFeeService.updateForm(updateFiels,whereClause,formNo); + }catch (Exception e) { + log.error("推送失败,请求批次号为:" + invoiceInfo.getReqNo() + " ,失败原因为: "+ e.getMessage()); + log.error(e); + } + } + } + }catch (Exception e) { + log.error("任务执行异常: "+e.getMessage()); + throw e; + } + return ""; + } + + private Map getInvoicerInfo(FormFieldVo vo) throws BusinessException { + FormDataOperator dataOperator = new FormDataOperator(); + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("OA一级单位").value(vo.getValue()).clauseFactor(ClauseFactor.EQ)); + String formNo = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.KPRDAFORMNO); + List columns = dataOperator.queryFormDataCondition(formNo, null, conditions); + if(columns == null || columns.size() == 0) { + throw new RuntimeException("开票人信息查询失败"); + } + FormColumn column = columns.get(0); + if(column.getVos().size() == 0 ) { + throw new RuntimeException("开票人信息查询失败"); + } + Map map = new HashMap<>(); + for (FormFieldVo columnVo : column.getVos()) { + if("开票人".equals(columnVo.getDisplayName())) { + map.put("开票人",columnVo.getValue() + ""); + } + } + if(!map.containsKey("开票人") || map.get("开票人") == null) { + throw new RuntimeException("开票人获取失败"); + } + return map; + } + + private Map getSellerInfo(FormFieldVo vo) throws BusinessException { + FormDataOperator dataOperator = new FormDataOperator(); + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().display("ORGCODE").value(vo.getValue()).clauseFactor(ClauseFactor.EQ)); + String orgFormNo = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.DAORGFORMNO); + List columns = dataOperator.queryFormDataCondition(orgFormNo, null, conditions); + if(columns == null || columns.size() == 0) { + throw new RuntimeException("销方信息查询失败"); + } + FormColumn column = columns.get(0); + if(column.getVos().size() == 0 ) { + throw new RuntimeException("销方信息查询失败"); + } + Map map = new HashMap<>(); + for (FormFieldVo columnVo : column.getVos()) { + if("ORGNAME".equals(columnVo.getDisplayName())) { + map.put("销售方名称",columnVo.getValue() + ""); + } + if("TAXID".equals(columnVo.getDisplayName())) { + map.put("销售方税号",columnVo.getValue() + ""); + } + } + if(!map.containsKey("销售方名称") || map.get("销售方名称") == null) { + throw new RuntimeException("销方名称获取失败"); + } + if(!map.containsKey("销售方税号") || map.get("销售方税号") == null) { + throw new RuntimeException("销方税号获取失败"); + } + return map; + } + + private void refreshRecord(String formNo,String formId) throws Exception { + String formLoginName = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.formInsertLoginName); + ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + ConfigVo config = cstConfigApi.getConfig(HxinvoiceConstants.getPluginId()); + String restLoginName = config.getParamVal(HxinvoiceConstants.localRestName.name()); + String restPwd = config.getParamVal(HxinvoiceConstants.localRestPwd.name()); + String rightId = powerFeePluginConfigProvider.getBizConfigByKey(PowerFeeInvoiceConstants.dfRightId); + String baseUrl = config.getParamVal(HxinvoiceConstants.localipport.name()); + String tokenUrl = baseUrl + config.getParamVal(HxinvoiceConstants.getTokenUrl.name()); + HttpFormRestApiConfig restApiConfig = new HttpFormRestApiConfig(); + restApiConfig.setRestPwd(restPwd); + restApiConfig.setRestUserName(restLoginName); + restApiConfig.setTokenUrl(tokenUrl); + restApiConfig.setBaseUrl(baseUrl); + restApiConfig.setRightId(rightId); + powerFeeService.refreshForm(formNo,formId,formLoginName,restApiConfig); + } + + private void fillInfo(FormFieldVo vo,PowerFeeInvoiceInfo invoiceInfo) { + BigDecimal multipy = new BigDecimal("1.0000"); + if(vo.getDisplayName().equals("电费单价") && vo.getValue() != null) { + BigDecimal bigDecimal = (BigDecimal)vo.getValue(); + invoiceInfo.setPrice(bigDecimal.multiply(multipy).setScale(4,BigDecimal.ROUND_HALF_UP).toString()); + } + if(vo.getDisplayName().equals("交易号") && vo.getValue() != null) { + invoiceInfo.setOrderNo(vo.getValue() + ""); + invoiceInfo.setReqNo(vo.getValue() + ""); + } + if(vo.getDisplayName().equals("订单请求流水号") && vo.getValue() != null) { + invoiceInfo.setOrderTradeNo(vo.getValue() + ""); + } + if(vo.getDisplayName().equals("电表用户编码")) { + invoiceInfo.setCustomerNo((String)vo.getValue()); + } + if(vo.getDisplayName().equals("金额") && vo.getValue() != null) { + BigDecimal bigDecimal = (BigDecimal)vo.getValue(); + invoiceInfo.setTotalPrice(bigDecimal.multiply(multipy).setScale(2,BigDecimal.ROUND_HALF_UP).toString()); + } + if(vo.getDisplayName().equals("电表租户名称")) { + invoiceInfo.setBuyer((String) vo.getValue()); + } + if(vo.getDisplayName().equals("销方纳税人识别号")) { + invoiceInfo.setSellerTaxNo((String)vo.getValue()); + } + if(vo.getDisplayName().equals("购方纳税人识别号")) { + invoiceInfo.setBuyerTaxNo((String)vo.getValue()); + } + if(vo.getDisplayName().equals("手机号")) { + invoiceInfo.setBuyerPhone((String)vo.getValue()); + } + if(vo.getDisplayName().equals("开票人")) { + invoiceInfo.setInvoicer((String) vo.getValue()); + } + if(vo.getDisplayName().equals("销方公司名称")) { + invoiceInfo.setSellerName((String)vo.getValue()); + } + if(vo.getDisplayName().equals("支付日期")) { + invoiceInfo.setDdsj(vo.getValue()); + } + } + + @Override + public String getName() { + return "电费信息推送航信发票"; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/service/HxInvoiceInfoFillService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/service/HxInvoiceInfoFillService.java new file mode 100644 index 0000000..e38cf83 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/service/HxInvoiceInfoFillService.java @@ -0,0 +1,311 @@ +package com.seeyon.apps.src_powerfeeinvoice.service; + +import cn.hutool.log.Log; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_hxinvoice.util.GzipUtils; +import com.seeyon.apps.src_hxinvoice.util.HxinvoiceHttpUtil; +import com.seeyon.apps.src_hxinvoice.util.TripleDesUtil; +import com.seeyon.apps.src_hxinvoice.vo.HxinvoiceResponse; +import com.seeyon.apps.src_powerfeeinvoice.vo.PowerFeeInvoiceInfo; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.text.SimpleDateFormat; +import java.util.TreeMap; + +public class HxInvoiceInfoFillService { + private static Log log = Log.get(HxInvoiceInfoFillService.class); + public String getParam(PowerFeeInvoiceInfo invoiceInfo){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + JSONObject jsonObject = new JSONObject(); + + JSONObject DDPCXX = new JSONObject(); + DDPCXX.put("DDQQPCH",invoiceInfo.getReqNo());//订单请求批次号 + DDPCXX.put("NSRSBH",invoiceInfo.getSellerTaxNo());//纳税人识别号 +// 001 是 数电专用发票 +// 002 是 数电普通发票 +// 003 是 数电机动车销售统一发票 +// 104 是 数电二手车销售统一发票 +// 085 是 数电纸票专用发票 +// 086 是 数电纸票普通发票 +// 087 是 数电纸票机动车销售统一发票 +// 088 是 数电纸票二手车销售统一发票 +// 004 否 增值税专用发票 +// 005 否 机动车销售统一发票 +// 006 否 二手车销售统一发票 +// 007 否 增值税普通发票 +// 026 否 增值税电子普通发票 +// 028 否 增值税电子专用发票 + DDPCXX.put("FPLXDM","002");//发票类型代码 +// DDPCXX.put("ENTID","");//企业组织ID + DDPCXX.put("KPFS","1");//开票方式0:自动开票;1:手动开票 + jsonObject.put("DDPCXX",DDPCXX); + + JSONArray DDZXXS = new JSONArray(); + for(int i = 0 ; i < 1 ; i++){ + JSONObject DDZXX = new JSONObject(); + + JSONObject DDTXX = new JSONObject(); + DDTXX.put("DDQQLSH",invoiceInfo.getOrderTradeNo());//订单请求流水号 + DDTXX.put("KPLX","0");//开票类型0蓝字发票1红字发票 + DDTXX.put("XHFSBH",invoiceInfo.getSellerTaxNo());//销货方纳税人识别号 + DDTXX.put("XHFMC",invoiceInfo.getSellerName());//销货方名称 +// DDTXX.put("XHFDZ","宜昌市港窑路5号");//销货方地址 +// DDTXX.put("XHFDH","0717-6452373");//销货方电话 +// DDTXX.put("XHFYH","");//销货方银行名称 +// DDTXX.put("XHFZH","");//销货方银行账号 +// DDTXX.put("NCPSGZJLXDM","");//农产品收购证件类型代码 +// 大小写 不得使用小写字母 +// 6~15位 6~15位任意数字字母组合 +// 16~18位 6位数字+最大12任意数字字母组合 +// 1位字母+6位数字+最大11位任意数字字母组合 +// 2位字母+6位数字+最大10位任意数字字母组合 +// 19~20位 15位身份证号(考虑最后一位X的情况)+最大5位任意数字字母组合 +// 18位身份证号(考虑最后一位X的情况)+最大2位任意数字字母组合 +// 1位字母+15位身份证号(考虑最后一位X的情况)+最大4位任意数字字母组合 +// 1位字母+18位身份证号(考虑最后一位X的情况)+最大1位任意数字字母组合 +// 6位数字+最大14位数字字母组合(不支持字母O、I、S、Z) +// 26位(数电) 由数字和大写字母组成 +// DDTXX.put("GMFBM","");//购买方编码 GMFSBH,GMFMC,GMFDZ,GMFDH,GMFYH,GMFZH,GMFLX + DDTXX.put("GMFSBH",invoiceInfo.getBuyerTaxNo());//购买方纳税人识别号GMFLX为01时必填;开具专用发票时必填; + DDTXX.put("GMFMC",invoiceInfo.getBuyer());//购买方名称 +// DDTXX.put("GMFDZ","中国(湖北)自贸区宜昌片区大连路33号清华科技园11栋705-706室");//购买方地址 + DDTXX.put("GMFDH",invoiceInfo.getBuyerPhone());//购买方电话 +// DDTXX.put("GMFYH","");//购买方银行名称 +// DDTXX.put("GMFZH","");//购买方银行账号 + DDTXX.put("GMFLX","04");//购买方类型 + DDTXX.put("GMFSJH",invoiceInfo.getBuyerPhone());//购买方手机 +// DDTXX.put("GMFDZYX","438926402@qq.com");//购买方邮箱 + DDTXX.put("KPR",invoiceInfo.getInvoicer());//开票人 +// DDTXX.put("KPRZJHM","");//开票人证件号码 +// 100 单位 +// 101 组织机构代码证 +// 102 营业执照 +// 103 税务登记证 +// 199 其他单位证件 +// 200 个人 +// 201 居民身份证 +// 202 军官证 +// DDTXX.put("KPRZJLX","");//开票人证件类型 +// DDTXX.put("SKR","");//收款人 +// DDTXX.put("FHR","");//复核人 + DDTXX.put("JSHJ",invoiceInfo.getTotalPrice());//价税合计 + DDTXX.put("HJJE","0");//合计金额 + DDTXX.put("HJSE","0");//合计税额 + DDTXX.put("BZ",invoiceInfo.getRemark());//备注 + DDTXX.put("DDH",invoiceInfo.getOrderNo());//订单号 + DDTXX.put("DDSJ",invoiceInfo.getDdsj());//订单时间 +// DDTXX.put("YWLX","");//业务类型 +// DDTXX.put("HZXXBBH","");//红字信息表编号 +// DDTXX.put("SFCF","");//是否拆分 +// DDTXX.put("SLKJLY","");//税率开具理由 +// DDTXX.put("YHM","");//电局登录用户名 +// DDTXX.put("SFZSGFDZDH","");//是否展示购方地址电话 +// DDTXX.put("SFZSGFYHZH","");//是否展示购方银行账号 +// DDTXX.put("SFZSXFDZDH","");//是否展示销方地址电话 +// DDTXX.put("SFZSXFYHZH","");//是否展示销方银行账号 +// DDTXX.put("BYZD1","");//备用字段1 +// DDTXX.put("BYZD2","");//备用字段2 +// DDTXX.put("BYZD3","");//备用字段3 +// DDTXX.put("BYZD4","");//备用字段4 +// DDTXX.put("BYZD5","");//备用字段5 + DDTXX.put("SX_CUSTOMERNO",invoiceInfo.getCustomerNo());//客户号 + DDTXX.put("SX_XTLY","SX_OA");//数据的来源系统 + DDZXX.put("DDTXX",DDTXX); + + JSONObject QDTXX = new JSONObject(); +// QDTXX.put("QYDM","");//区域代码 +// QDTXX.put("CEZSLXDM","");//差额征税类型代码 +// QDTXX.put("SGFPLXDM","");//收购发票类型代码 +// QDTXX.put("CKYWSYZCDM","");//出口业务适用政策代码 +// QDTXX.put("ZZSJZJTDM","");//增值税即征即退代码 +// QDTXX.put("ZPPZDM","");//纸票票种代码 +// QDTXX.put("GMFJBR","");//经办人 +// QDTXX.put("JBRSFZJHM","");//经办人身份证件号码 +// QDTXX.put("GMFJBRLXDH","");//经办人联系电话 +// QDTXX.put("JSFS","");//结算方式 +// QDTXX.put("SKYHMC","");//收款银行名称 +// QDTXX.put("SKYHZH","");//收款银行账号 +// QDTXX.put("YSXWFSD","");//应税行为发生地 +// QDTXX.put("JAZSLXDM","");//减按征税类型代码 +// JSONArray FJYSLISTS = new JSONArray(); +// for(int n = 0 ; n < 1 ; n++){ +// JSONObject FJYSLIST = new JSONObject(); +// FJYSLIST.put("FJYSMC","");//附加要素名称 +// FJYSLIST.put("FJYSLX","");//附加要素类型 +// FJYSLIST.put("FJYSZ","");//附加要素值 +// FJYSLISTS.add(FJYSLIST); +// } +// QDTXX.put("FJYSLIST",FJYSLISTS); +// JSONArray CEZSLISTS = new JSONArray(); +//// 1.开具蓝字发票 +//// 1.1 CEZSLXDM=01且发票明细行KCE等于0时该节点整体信息非必填; +//// 1.2 CEZSLXDM=01且发票明细行KCE大于0时该节点整体信息必填; +//// 1.3 CEZSLXDM=02时该节点整体信息必填; +//// +//// 2.开具红字发票 +//// 2.1 该节点整体信息非必填; +//// 2.2 必须全额冲红,扣除额为负数,其绝对值必须与蓝票扣除额相同 +//// +//// 3.填写时必须填写以下完整的字段信息; +//// for(int n = 0 ; n < 1 ; n++){ +//// JSONObject CEZSLIST = new JSONObject(); +//// CEZSLIST.put("XH","");//序号 +//// CEZSLIST.put("PZLX","");//凭证类型 +//// CEZSLIST.put("FPDM","");//发票代码 +//// CEZSLIST.put("FPHM","");//发票号码 +//// CEZSLIST.put("ZZFPHM","");//纸质发票号码 +//// CEZSLIST.put("PZHM","");//凭证号码 +//// Date date = new Date(); +//// CEZSLIST.put("KJRQ","");//开具日期 +//// CEZSLIST.put("HJJE","");//合计金额 +//// CEZSLIST.put("KCE","");//扣除额 +//// CEZSLIST.put("BZ","");//备注 +//// CEZSLIST.put("LRFS","");//录入方式 +//// CEZSLIST.put("BCKCJE","");//本次扣除金额 +//// CEZSLIST.put("PZHJJE","");//凭证合计金额 +//// CEZSLISTS.add(CEZSLIST); +//// } +// QDTXX.put("CEZSLIST",CEZSLISTS); + DDZXX.put("QDTXX",QDTXX); + + JSONArray DDMXXXS = new JSONArray(); + for(int n = 0 ; n < 1 ; n++){ + JSONObject DDMXXX = new JSONObject(); +// DDMXXX.put("XH","");//项目序号 +// DDMXXX.put("DYLZFPMXXH","");//对应蓝字发票明细序号 +// 如果传递该值,SPBM,ZXBM,YHZCBS,LSLBS,ZZSTSGL,XMMC,GGXH,DW,SPSL,DJ,HSBZ,SL,SE非必填,会使用该值在发票系统维护的数据进行补全,如果上述节点填写数据,则以填写数据为准. + DDMXXX.put("SPID","");//商品ID + DDMXXX.put("FPHXZ","0");//发票行性质 + DDMXXX.put("SPBM","1100101020100000000");//商品编码 +// DDMXXX.put("ZXBM","");//自行编码 + DDMXXX.put("YHZCBS","0");//优惠政策标识 +// 空:非零税率,1:免税,2:不征税 3:普通零税率 +// 若填写了3(普通零税率), 则: +// YHZCBS填0,ZZSTSGL填空 +// DDMXXX.put("LSLBS","");//零税率标识 +// DDMXXX.put("ZZSTSGL","");//增值税特殊管理 +// DDMXXX.put("XMMC","");//项目名称 +// DDMXXX.put("GGXH","");//规格型号 +// DDMXXX.put("DW","");//单位 +// DDMXXX.put("SPSL","1");//商品数量 + DDMXXX.put("DJ",invoiceInfo.getPrice());//单价 + DDMXXX.put("JE",invoiceInfo.getTotalPrice());//金额 + DDMXXX.put("HSBZ","1");//含税标志 + DDMXXX.put("SL","0.13");//税率 + DDMXXX.put("SE","");//税额 +// DDMXXX.put("KCE","");//扣除额 +// DDMXXX.put("BYZD1","");//备用字段1 +// DDMXXX.put("BYZD2","");//备用字段2 +// DDMXXX.put("BYZD3","");//备用字段3 + DDMXXXS.add(DDMXXX); + } + DDZXX.put("DDMXXX",DDMXXXS); + DDZXXS.add(DDZXX); + } + jsonObject.put("DDZXX",DDZXXS); + return jsonObject.toString(); + } + + public void pushInvoiceInfo(String params,String secretKey,String secretId,String url) throws Exception { +// String secretKey = "IGedAOlfMsPotl7WXePNPSNdPtjnvn85Tvt9"; +// secretId +// String secretId = "NfD7rBPYAk1Zod37wqlB4wWdgSFtRgMj"; +// 请求类型 + String qingqiu = "POST"; +// 接口地址 +// String url = "10.1.10.202:10000/sims-api/invoice/api/v6/GenerateQdInvoice"; +// 设置自定义字段 + String dataExchangeId = "20241205"; + String password = secretKey.substring(0, 24); +// 压缩工具类 + GzipUtils gzipUtils = new GzipUtils(); +// 加解密工具类 + TripleDesUtil tripleDesUtil = new TripleDesUtil(); + + System.out.println(params); + byte[] src = params.getBytes("UTF-8"); +// 判断是否需要加密 + String encryptCode = "1";//固定为1进行加密 + byte[] bys = {}; + if ("1".equals(encryptCode)) { + // 进行加密 + bys = tripleDesUtil.encryptMode(password, src); + } +// 判断是否需要压缩 + String zipCode = "1";//固定为1进行压缩 + byte[] gzis = bys; + if ("1".equals(zipCode)) { + // 进行压缩 + gzis = gzipUtils.compress(bys); + } +// 进行baes64加密 + String base64Encoded = Base64.encodeBase64URLSafeString(gzis); +// 设置签名参数 + TreeMap treeMap = new TreeMap<>(); + treeMap.put("content", base64Encoded); + treeMap.put("dataExchangeId", dataExchangeId); + treeMap.put("encryptCode", encryptCode); + treeMap.put("secretId", secretId); + treeMap.put("zipCode", zipCode); + StringBuilder contentStr = new StringBuilder(); + for (String key : treeMap.keySet()) { + contentStr.append(key + "=" + treeMap.get(key) + "&"); + } + String content = contentStr.toString(); + content = content.substring(0, content.length() - 1); + log.info("水电费开票推送参数: " + content); + String[] urls = url.split("/"); + String uri = urls[0]; + String fuwu = "/" + urls[1]; + String path = "/" + urls[2] + "/" + urls[3] + "/"; + String banben = urls[4]; + String method = "/" + urls[5]; + String srcStr = qingqiu + uri + fuwu + path + banben + method + "?" + content; +// 进行签名 + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); + Mac mac = Mac.getInstance("HmacSHA1"); + mac.init(keySpec); + byte[] signBytes = mac.doFinal(srcStr.getBytes("UTF-8")); +// 签名转换成字符串 + String signStr = Base64.encodeBase64URLSafeString(signBytes); +// 设置参数 + JSONObject jsonGenerateQdInvoice = new JSONObject(); + jsonGenerateQdInvoice.put("secretId", secretId); + jsonGenerateQdInvoice.put("dataExchangeId", dataExchangeId); + jsonGenerateQdInvoice.put("encryptCode", encryptCode); + jsonGenerateQdInvoice.put("zipCode", zipCode); + jsonGenerateQdInvoice.put("content", base64Encoded); + jsonGenerateQdInvoice.put("signature", signStr); + System.out.println(jsonGenerateQdInvoice); + String res = HxinvoiceHttpUtil.doPost("http://" + url, jsonGenerateQdInvoice.toString()); + JSONObject resjson = JSON.parseObject(res); + String con = resjson.getString("content"); + byte[] decodedBytes = Base64.decodeBase64(con); + String iszipCode = resjson.getString("zipCode"); + String isencryptCode = resjson.getString("encryptCode"); +// 是否需要进行解压 + byte[] dec = decodedBytes; + if ("1".equals(iszipCode)) { + dec = gzipUtils.decompress(decodedBytes); + } +// 是否需要进行解密 + byte[] d = dec; + if ("1".equals(isencryptCode)) { + d = tripleDesUtil.decryptMode(password, dec); + } + String str = new String(d, "UTF-8"); + HxinvoiceResponse hxinvoiceResponse = HxinvoiceHttpUtil.parseResponse(str); + if (hxinvoiceResponse.isSuccess()) { + System.out.println("参数处理完成" + hxinvoiceResponse); + log.info("开票信息推送成功: " + hxinvoiceResponse.getData()); + System.out.println("推送成功显示" + hxinvoiceResponse.getMsg()); + } else { + System.out.println(hxinvoiceResponse.getMsg()); + log.info("电费发票信息推送失败: " + hxinvoiceResponse.getMsg()); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/service/PowerFeeService.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/service/PowerFeeService.java new file mode 100644 index 0000000..56cbf52 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/service/PowerFeeService.java @@ -0,0 +1,127 @@ +package com.seeyon.apps.src_powerfeeinvoice.service; + +import com.seeyon.apps.src_hxinvoice.util.FileUtil; +import com.seeyon.apps.src_hxinvoice.util.FormExportUtil; +import com.seeyon.apps.src_powerfeeinvoice.config.HttpFormRestApiConfig; +import com.seeyon.apps.src_powerfeeinvoice.config.PowerFeePluginConfigProvider; +import com.seeyon.apps.src_powerfeeinvoice.constants.PowerFeeInvoiceConstants; +import com.seeyon.apps.src_powerfeeinvoice.utils.ClauseFactor; +import com.seeyon.apps.src_powerfeeinvoice.utils.EnumMapUtils; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormColumn; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormDataOperator;; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormWhereCondition; +import com.seeyon.apps.src_powerfeeinvoice.utils.FormUpdateField; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Component +public class PowerFeeService { + + public List queryCondition(String formNo, List queryColumnVos, List conditionVos) throws BusinessException { + FormDataOperator formDataOperator = new FormDataOperator(); + return formDataOperator.queryFormDataCondition(formNo, queryColumnVos, conditionVos); + } + + public void refreshForm(String formNo, String formId, String formLoginName, HttpFormRestApiConfig config) throws BusinessException, IOException { + FormDataOperator formDataOperator = new FormDataOperator(); + formDataOperator.refreshForm(formId,formNo,formLoginName,config); + } + + public FormColumn getById(String formNo,String formId) throws Exception { + FormDataOperator formDataOperator = new FormDataOperator(); + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, Arrays.asList(FormWhereCondition.build().display("ID").value(formId).clauseFactor(ClauseFactor.EQ))); + if(formColumns == null || formColumns.size() == 0 ){ + throw new RuntimeException("记录未找到"); + } + return formColumns.get(0); + } + + public Long count(String formNo) throws Exception{ + FormDataOperator formDataOperator = new FormDataOperator(); + return formDataOperator.countCondition(formNo,new ArrayList<>()); + } + + public void updateForm(List updateFieldVos,List whereClauseData,String formNo) throws BusinessException { + FormDataOperator formDataOperator = new FormDataOperator(); + formDataOperator.updateMasterForm(formNo,updateFieldVos,whereClauseData); + } + + public void insertIntoInvoiceForm(Map map,List fileNames,Long memberId,Long account) throws Exception { + FileUtil fileUtil = new FileUtil(); + PowerFeePluginConfigProvider configProvider = (PowerFeePluginConfigProvider) AppContext.getBean("powerFeePluginConfigProvider"); + List queryCondition = new ArrayList<>(); + String formNo = configProvider.getBizConfigByKey(PowerFeeInvoiceConstants.invoiceFormNo); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + String KPLX = (String)map.get("开票类型"); + map.put("红蓝票类型", EnumMapUtils.getEnumItemValueByEnumIdAndEnumValue(KPLX, masterTableBean.getFieldBeanByDisplay("红蓝票类型").getEnumId())); + FormExport formExport = new FormExport(); + FormExportUtil formExportUtil = new FormExportUtil(); + List valueExport = formExportUtil.setFormValue(map); + String DDQQLSH = (String) map.get("订单请求流水号"); + if(checkInvoiceRecordExist(DDQQLSH,formNo)) { + //记录已存在则不继续添加 + return; + } + formExport.setValues(valueExport); + FormFactory formFactory = (FormFactory) AppContext.getBean("formFactory"); + String loginName = configProvider.getBizConfigByKey(PowerFeeInvoiceConstants.formInsertLoginName); + //核对枚举是否需要转换处理.. + formFactory.importBusinessFormData(loginName, formNo, + formExport, new String[] {}); + FormDataOperator formDataOperator = new FormDataOperator(); + queryCondition.add(FormWhereCondition.build().display("订单请求流水号").value(DDQQLSH).clauseFactor(ClauseFactor.EQ)); + List columns = formDataOperator.queryFormDataCondition(formNo, null, queryCondition); + if(columns != null && columns.size() > 0) { + String formId = columns.get(0).getId(); + List attachments = fileUtil.fileUpload(fileNames,formId,memberId,account); + String refId = attachments.get(0).getSubReference()+""; + FormUpdateField updateField = FormUpdateField.build().display("数电发票附件").value(refId); + List whereConditions = new ArrayList<>(); + whereConditions.add(FormWhereCondition.build().value(formId).display("ID").clauseFactor(ClauseFactor.EQ)); + formDataOperator.updateMasterForm(formNo, Arrays.asList(updateField),whereConditions); + } + } + + private boolean checkInvoiceRecordExist(String DDQQLSH,String formNo) throws BusinessException { + FormDataOperator formDataOperator = new FormDataOperator(); + List queryCondition = new ArrayList<>(); + queryCondition.add(FormWhereCondition.build().display("订单请求流水号").value(DDQQLSH).clauseFactor(ClauseFactor.EQ)); + List columns = formDataOperator.queryFormDataCondition(formNo, null, queryCondition); + return !(columns == null || columns.size() == 0); + } + + public void updatePowerFeeForm(Map map) throws Exception { + PowerFeePluginConfigProvider configProvider = (PowerFeePluginConfigProvider) AppContext.getBean("powerFeePluginConfigProvider"); + List queryCondition = new ArrayList<>(); + String qqlsh = (String) map.get("订单请求流水号"); + queryCondition.add(FormWhereCondition.build().value(qqlsh).display("订单请求流水号").clauseFactor(ClauseFactor.EQ)); + String formId = null; + List columns = queryCondition(configProvider.getBizConfigByKey(PowerFeeInvoiceConstants.formNo), null, queryCondition); + if(columns == null || columns.size() == 0) { + throw new RuntimeException("按照订单请求流水号查询的电费信息不存在"); + } + FormColumn column = columns.get(0); + formId = column.getId(); + List updateFields = new ArrayList<>(); + updateFields.add(FormUpdateField.build().display("是否已开票").value("是")); + List conditions = new ArrayList<>(); + conditions.add(FormWhereCondition.build().value(Long.parseLong(formId)).display("id").clauseFactor(ClauseFactor.EQ)); + updateForm(updateFields,conditions,configProvider.getBizConfigByKey(PowerFeeInvoiceConstants.formNo)); + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/ClauseFactor.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/ClauseFactor.java new file mode 100644 index 0000000..ccb2710 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/ClauseFactor.java @@ -0,0 +1,19 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +public enum ClauseFactor { + EQ, //相等 + GT, //大于 + GE, //大于等于 + LT, //小于 + LE, //小于等于 + NULL, //空 + NOT_NULL, //非空 + LIKE, //模糊 + AND, + OR + ; + + public boolean isNullType() { + return this == NULL || this == NOT_NULL; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/EnumMapUtils.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/EnumMapUtils.java new file mode 100644 index 0000000..aad5f0f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/EnumMapUtils.java @@ -0,0 +1,86 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumBean; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.util.JDBCAgent; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class EnumMapUtils { + public static String getEnumItemValue(String rootPCode, String groupValue, String targetValue) { + if(targetValue == null || "null".equals(targetValue) || "".equals(targetValue)){ + return ""; + } + String queryIdSql = "SELECT ce.ID FROM ctp_enum ce inner join ctp_enum cei on ce.`PARENT_ID` = cei.ID where CEI.`PROGRAM_CODE` = ? and ce.`ENUMNAME` = ?"; + Long enumId = null; + JDBCAgent agent = new JDBCAgent(); + try { + agent.execute(queryIdSql, Arrays.asList(rootPCode,groupValue)); + List> list = (List>) agent.resultSetToList(); + if(list == null || list.size() == 0) { + return ""; + } + Map map = list.get(0); + enumId = (Long)map.get("ID"); + } catch (Exception e) { + return ""; + }finally { + agent.close(); + } + EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); + if(ctpEnumBean == null) { + return ""; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return ""; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getShowvalue().equals(targetValue)) { + return enumItem.getId() + ""; + } + } + return ""; + } + + public static String getEnumItemValueByEnumId(String showValue,long enumId) { + EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); + if(ctpEnumBean == null) { + return ""; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return ""; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getShowvalue().equals(showValue)) { + return enumItem.getId() + ""; + } + } + return ""; + } + + public static String getEnumItemValueByEnumIdAndEnumValue(String value,long enumId) { + EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); + if(ctpEnumBean == null) { + return ""; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return ""; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getValue().equals(value)) { + return enumItem.getId() + ""; + } + } + return ""; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormColumn.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormColumn.java new file mode 100644 index 0000000..d6943b6 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormColumn.java @@ -0,0 +1,24 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +import java.util.List; + +public class FormColumn { + private String id; + private List vos; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getVos() { + return vos; + } + + public void setVos(List vos) { + this.vos = vos; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormDataOperator.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormDataOperator.java new file mode 100644 index 0000000..3a14adc --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormDataOperator.java @@ -0,0 +1,644 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.aicloud.common.JsonUtils; +import com.seeyon.apps.src_powerfeeinvoice.config.HttpFormRestApiConfig; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormBindAuthBean; +import com.seeyon.cap4.form.bean.FormBindBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.client.CTPRestClient; +import com.seeyon.client.CTPServiceClientManager; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.JDBCAgent; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicHeader; +import org.apache.http.util.EntityUtils; +import www.seeyon.com.utils.StringUtil; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class FormDataOperator { + + public void updateMasterForm(String formNo, List updateFieldVos, List conditionVos) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + if (updateFieldVos == null) { + throw new IllegalArgumentException("要修改的字段为空"); + } + for (FormUpdateField fieldVo : updateFieldVos) { + FormFieldBean bean = masterTableBean.getFieldBeanByDisplay(fieldVo.getDisplay()); + if (bean == null) { + continue; + } + if(bean.getInputType().equals("image") || bean.getInputType().equals("attachment")) { + + } + fieldVo.fieldName(bean.getColumnName()); + } + List updateFields = updateFieldVos.stream().filter(u -> u.getFieldName() != null).collect(Collectors.toList()); + for (FormWhereCondition conditionVo : conditionVos) { + FormFieldBean bean = masterTableBean.getFieldBeanByDisplay(conditionVo.getDisplay()); + if (bean == null) { + if (conditionVo.getDisplay().equals("ID") || conditionVo.getDisplay().equals("id")) { + conditionVo.setFieldName(conditionVo.getDisplay()); + } + continue; + } + conditionVo.setFieldName(bean.getColumnName()); + } + List conditions = conditionVos.stream().filter(c -> c.getFieldName() != null).collect(Collectors.toList()); + Map map = generateSql(updateFields, masterTableBean.getTableName(), conditions); + JDBCAgent agent = new JDBCAgent(); + try { + agent.execute((String) map.get("sql"), (List) map.get("params")); + return; + } catch (Exception e) { + e.printStackTrace(); + } finally { + agent.close(); + } + } + + public Long countCondition(String formNo,List conditionVos) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + String tableName = masterTableBean.getTableName(); + for (FormWhereCondition conditionVo : conditionVos) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(conditionVo.getDisplay()); + if (fieldBeanByDisplay == null) { + continue; + } + conditionVo.setFieldName(fieldBeanByDisplay.getColumnName()); + } + + Map generateSql = generateSql(conditionVos, tableName); + String sql = (String) generateSql.get("sql"); + List params = (List) generateSql.get("params"); + JDBCAgent jdbcAgent = new JDBCAgent(); + try { + jdbcAgent.execute(sql, params); + return (Long) jdbcAgent.resultSetToMap().get("countsize"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } finally { + jdbcAgent.close(); + } + return null; + } + + public void refreshForm(String id, String formNo, String formLoginName, HttpFormRestApiConfig config) throws BusinessException, IOException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + List dataList = new ArrayList<>(); + Map temp1 = new HashMap<>(); + Map temp2 = new HashMap<>(); + temp1.put("masterTable",temp2); + temp2.put("name",masterTableBean.getTableName()); + Map recordMap = new HashMap<>(3); // 容量=3 (2/0.75≈2.67) + recordMap.put("id", id); + recordMap.put("fields", new ArrayList<>()); + temp2.put("record", recordMap); + temp2.put("changedFields",new ArrayList<>()); + dataList.add(temp1); + String token = getToken(config.getTokenUrl(),config.getRestUserName(),config.getRestPwd(),formLoginName); + Map beanMap = new HashMap(); + beanMap.put("formCode", formNo); + beanMap.put("loginName", formLoginName); + beanMap.put("doTrigger", "true"); + beanMap.put("rightId", config.getRightId()); + beanMap.put("dataList",dataList); + Map header = new HashMap<>(); + header.put("token", token); + String url = config.getBaseUrl() + "/seeyon/rest/cap4/form/soap/batch-update"; + String response = HttpClient.httpPostRaw(url, JsonUtils.toJSONString(beanMap), header, "UTF-8"); + System.out.println(response); + } + private String getToken(String oatokenurl,String restName,String restPassword,String loginName) throws FileNotFoundException, IOException { + String address = oatokenurl + restName + "/" + restPassword; + if(StringUtil.isNotEmpty(loginName)){ + address = address +"?loginName="+loginName; + } + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(address); + // 添加 Headers 信息 + get.addHeader(new BasicHeader("Accept", "application/json")); + try { + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + String token = ""; + if(result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + token = jsObj.get("id").toString(); + }else { + token = result; + } + return token; + } + + public List queryFormDataCondition(String formNo, List queryColumnVos, List conditionVos) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List queryColumns = new ArrayList<>(); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + String tableName = masterTableBean.getTableName(); + Map fieldMap4Name = masterTableBean.getFieldMap4Name(); + if (queryColumnVos != null) { + for (String queryColumnVo : queryColumnVos) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(queryColumnVo); + if (fieldBeanByDisplay == null) { + continue; + } + queryColumns.add(fieldBeanByDisplay.getColumnName()); + } + } + for (FormWhereCondition conditionVo : conditionVos) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(conditionVo.getDisplay()); + if (fieldBeanByDisplay == null) { + if (conditionVo.getDisplay().equals("ID") || conditionVo.getDisplay().equals("id")) { + conditionVo.setFieldName(conditionVo.getDisplay()); + } + continue; + } + conditionVo.setFieldName(fieldBeanByDisplay.getColumnName()); + } + + Map generateSql = generateSql(queryColumns, conditionVos, tableName); + String sql = (String) generateSql.get("sql"); + List params = (List) generateSql.get("params"); + JDBCAgent jdbcAgent = new JDBCAgent(); + List columns = new ArrayList<>(); + try { + jdbcAgent.execute(sql, params); + List list = jdbcAgent.resultSetToList(); + for (Object o : list) { + FormColumn column = new FormColumn(); + Map columnMap = (Map) o; + List vos = new ArrayList<>(); + for (String key : columnMap.keySet()) { + FormFieldVo fieldVo = new FormFieldVo(); + if (fieldMap4Name.containsKey(key)) { + FormFieldBean fieldBean = fieldMap4Name.get(key); + fieldVo.setDisplayName(fieldBean.getDisplay()); + fieldVo.setValue(columnMap.get(key)); + vos.add(fieldVo); + } + } + column.setVos(vos); + if (columnMap.get("id") != null) { + column.setId(columnMap.get("id") + ""); + } + columns.add(column); + } + return columns; + } catch (Exception e) { + System.out.println(e.getMessage()); + } finally { + jdbcAgent.close(); + } + return null; + } + + private Map generateSql(List conditions, String tableName) { + if (tableName == null) { + throw new IllegalArgumentException("tableName cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("SELECT count(*) as countSize "); + sqlBuilder.append(" from " + tableName); + List params = new ArrayList<>(); + sqlBuilder.append(buildWhereClause(conditions,params)); + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + private Map generateSql(List queryColumn, List conditions, String tableName) { + if (tableName == null) { + throw new IllegalArgumentException("tableName cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("SELECT "); + if (queryColumn == null || queryColumn.isEmpty()) { + sqlBuilder.append("*"); + } + + for (int i = 0; i < queryColumn.size(); i++) { + sqlBuilder.append(queryColumn.get(i)); + if (queryColumn.size() > 1 && i >= 0 && i < queryColumn.size() - 1) { + sqlBuilder.append(","); + } + } + + if (queryColumn.size() > 0) { + sqlBuilder.append(",`ID`"); + } + + sqlBuilder.append(" from " + tableName); + List params = new ArrayList<>(); + sqlBuilder.append(buildWhereClause(conditions,params)); + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + private Map generateSql(List fieldValues, String tableName,List conditions) { + if (fieldValues == null || fieldValues.isEmpty()) { + throw new IllegalArgumentException("Field values cannot be null or empty"); + } + if (tableName == null || tableName.trim().isEmpty()) { + throw new IllegalArgumentException("Table name cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("UPDATE ").append(tableName).append(" SET "); + List params = new ArrayList<>(); + // Build the SET clause + int fieldCount = 0; + for (FormUpdateField updateField : fieldValues) { + if (updateField.getValue() == null || "".equals(updateField.getValue()) || "null".equals(updateField.getValue())) { + continue; + } + if (fieldCount > 0) { + sqlBuilder.append(", "); + } + if (updateField.getValue() instanceof String && ((String) updateField.getValue()).startsWith("DATE>")) { + String oldValue = (String) updateField.getValue(); + sqlBuilder.append(updateField.getFieldName()).append(" = TO_DATE( ?, 'YYYY-MM-DD')"); + updateField.setValue(oldValue.substring(oldValue.indexOf(">") + 1)); + } else { + sqlBuilder.append(updateField.getFieldName()).append(" = ?"); + } + params.add(updateField.getValue()); + fieldCount++; + } + String whereClauseStr = buildWhereClause(conditions,params); + // Append the WHERE clause + sqlBuilder.append(whereClauseStr); + // Create result map + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + public Map> getMainFormTableAttachments(String formNo,Map sourceMap) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + Map> attachmentTempMap = new HashMap<>(); + Set removeKey = new HashSet<>(); + for (String key : sourceMap.keySet()) { + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null ){ + continue; + } + if(fieldBeanByDisplay.getInputType().equals("image") || + fieldBeanByDisplay.getInputType().equals("attachment")) { + attachmentTempMap.put(fieldBeanByDisplay.getDisplay(),(List)sourceMap.get(key)); + removeKey.add(key); + } + } + for (String key : removeKey) { + sourceMap.remove(key); + } + return attachmentTempMap; + } + + public Map> getSubFormTableAttachments(String formNo,Map sourceMap) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List subTableBean = cap4FormBean.getSubTableBean(); + Map> attachmentTempMap = new HashMap<>(); + String tableName = null; + for (String key : sourceMap.keySet()) { + tableName = key; + } + String finalTableName = tableName; + FormTableBean tableBean = subTableBean.stream().filter(s->s.getTableName().equals(finalTableName)).collect(Collectors.toList()).get(0); + List> tableData = (List>)sourceMap.get(tableName); + Set removeKey = new HashSet<>(); + for (Map rowData : tableData) { + for (String key : rowData.keySet()) { + FormFieldBean fieldBeanByDisplay = tableBean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null ){ + continue; + } + if(fieldBeanByDisplay.getInputType().equals("image") || + fieldBeanByDisplay.getInputType().equals("attachment")) { + attachmentTempMap.put(fieldBeanByDisplay.getDisplay(),(List)sourceMap.get(key)); + removeKey.add(key); + } + } + for (String key : removeKey) { + rowData.remove(key); + } + removeKey.clear(); + } + return attachmentTempMap; + } + + public void addSubTableRecord(String subTableName,List data,String formNo,String formId) { + JDBCAgent agent = new JDBCAgent(); + try { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List tableBean = cap4FormBean.getSubTableBean(); + for (FormTableBean bean : tableBean) { + if(!bean.getTableName().equals(subTableName)) { + continue; + } + for (Object column : data) { + Map map = (Map) column; + Map tempMap = new HashMap<>(); + for (String key : map.keySet()) { + FormFieldBean fieldBeanByDisplay = bean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null) { + continue; + } + tempMap.put(fieldBeanByDisplay.getColumnName(),map.get(key)); + } + tempMap.put("formmain_id",formId); + tempMap.put("sort",1); + tempMap.put("ID",Math.abs(UUID.randomUUID().getLeastSignificantBits())); + Map insertSql = generateInsertSql(tempMap, subTableName); + agent.execute((String)insertSql.get("sql"),(List)insertSql.get("params")); + } + } + } catch (Exception e) { + + } finally { + agent.close(); + } + } + + public void rebuildSubTableRecord(String subTableName,List data,String formNo,String formId) { + String deleteSql = "delete from " + subTableName + " where formmain_id = ? "; + JDBCAgent agent = new JDBCAgent(); + try { + agent.execute(deleteSql, Arrays.asList(formId)); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List tableBean = cap4FormBean.getSubTableBean(); + for (FormTableBean bean : tableBean) { + if(!bean.getTableName().equals(subTableName)) { + continue; + } + for (Object column : data) { + Map map = (Map) column; + Map tempMap = new HashMap<>(); + for (String key : map.keySet()) { + FormFieldBean fieldBeanByDisplay = bean.getFieldBeanByDisplay(key); + if(fieldBeanByDisplay == null) { + continue; + } + tempMap.put(fieldBeanByDisplay.getColumnName(),map.get(key)); + } + tempMap.put("formmain_id",formId); + tempMap.put("sort",1); + tempMap.put("ID",Math.abs(UUID.randomUUID().getLeastSignificantBits())); + Map insertSql = generateInsertSql(tempMap, subTableName); + agent.execute((String)insertSql.get("sql"),(List)insertSql.get("params")); + } + } + } catch (Exception e) { + + } finally { + agent.close(); + } + } + + public void handleEnumDeptEtc(Map map,String formNo) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + for (String key : map.keySet()) { + FormFieldBean fieldBean = masterTableBean.getFieldBeanByDisplay(key); + if(fieldBean == null) { + continue; + } + switch (fieldBean.getInputType()) { + case "select": if(fieldBean.getEnumId() != 0l) { + String enumItemId = EnumMapUtils.getEnumItemValueByEnumId((String)map.get(key),fieldBean.getEnumId()); + map.put(key,enumItemId); + } break; + case "image":break; + case "attachment": break; + case "account": break; + case "department": break; + case "radio": break; + case "member":break; + case "checkbox": + case "date": + case "text":break; + default: break; + + } + } + } + + public void handleSubTableEnumDeptEtc(Map map,String formNo) throws BusinessException { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + List subTableBean = cap4FormBean.getSubTableBean(); + for (FormTableBean tableBean : subTableBean) { + String tableName = null; + for (String key : map.keySet()) { + tableName = key; + } + if(!tableBean.getTableName().equals(tableName)) { + continue; + } + List> subDatas = (List>) map.get(tableName); + for (Map subData : subDatas) { + for (String key : subData.keySet()) { + FormFieldBean fieldBean = tableBean.getFieldBeanByDisplay(key); + if(fieldBean == null) { + continue; + } + switch (fieldBean.getInputType()) { + case "select": if(fieldBean.getEnumId() != 0l) { + String enumItemId = EnumMapUtils.getEnumItemValueByEnumId((String)subData.get(key),fieldBean.getEnumId()); + subData.put(key,enumItemId); + } break; + case "image":break; + case "attachment": break; + case "account": break; + case "department": break; + case "radio": break; + case "member":break; + case "checkbox": + case "date": + case "text":break; + default: break; + + } + } + } + } + } + + public boolean isMasterTableFile(String displayName,String formNo) { + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + try { + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + FormFieldBean fieldBeanByDisplay = masterTableBean.getFieldBeanByDisplay(displayName); + return fieldBeanByDisplay.getInputType().equals("image") || fieldBeanByDisplay.getInputType().equals("attachment"); + } catch (BusinessException e) { + + } + return false; + } + + private Map generateInsertSql(Map data, String tableName) { + if (tableName == null || tableName.isEmpty()) { + throw new IllegalArgumentException("tableName cannot be null or empty"); + } + if (data == null || data.isEmpty()) { + throw new IllegalArgumentException("data cannot be null or empty"); + } + StringBuilder sqlBuilder = new StringBuilder("INSERT INTO " + tableName + " ("); + List params = new ArrayList<>(); + // 拼接字段名 + StringBuilder columns = new StringBuilder(); + // 拼接字段值 + StringBuilder values = new StringBuilder(); + for (Map.Entry entry : data.entrySet()) { + // 拼接字段名 + if (columns.length() > 0) { + columns.append(", "); + } + columns.append(entry.getKey()); + // 拼接值,使用占位符 ? + if (values.length() > 0) { + values.append(", "); + } + values.append("?"); + // 将值加入 params 列表 + params.add(entry.getValue()); + } + // 完善 SQL 语句 + sqlBuilder.append(columns).append(") VALUES (").append(values).append(");"); + Map result = new HashMap<>(); + result.put("sql", sqlBuilder.toString()); + result.put("params", params); + return result; + } + + /** + * 动态生成 WHERE 子句 + * @param conditions 条件集合 + * @param params 参数列表(引用传递) + * @return 拼接后的 WHERE 子句(包含 WHERE 关键字) + */ + private String buildWhereClause(List conditions, List params) { + if (conditions == null || conditions.isEmpty()) { + return ""; + } + + StringBuilder whereClause = new StringBuilder(" WHERE "); + int conditionIndex = 0; + + for (FormWhereCondition condition : conditions) { + // 处理括号起始 + if (condition.isStartWithBracket()) { + whereClause.append("("); + } + + // 字段名校验 + String fieldName = condition.getFieldName(); + ClauseFactor factor = condition.getClauseFactor(); + String operator = parseOperator(factor); + + // 构建条件表达式 + String conditionExpr; + if (factor.isNullType()) { + // 处理 NULL/NOT NULL 条件(无需参数) + conditionExpr = String.format("%s %s", fieldName, operator); + } else { + // 处理普通条件(带占位符) + conditionExpr = String.format("%s %s ?", fieldName, operator); + // 处理函数模板(如 TO_DATE) + if (condition.getIndex() != null) { + conditionExpr = conditionExpr.replace("?", condition.getIndex()); + } + // 添加参数值 + params.add(condition.getValue()); + } + + whereClause.append(conditionExpr); + + // 处理括号闭合 + if (condition.isEndWithBracket()) { + whereClause.append(")"); + } + + // 添加连接符(AND/OR) + if (conditionIndex < conditions.size() - 1) { + whereClause.append(" ").append(condition.getConcatFactor()).append(" "); + } + conditionIndex++; + } + + return whereClause.toString(); + } + + /** + * 校验字段名合法性(防止 SQL 注入) + */ + private String validateFieldName(String fieldName) { + if (!fieldName.matches("^[a-zA-Z_][a-zA-Z0-9_]*$")) { + throw new IllegalArgumentException("非法字段名: " + fieldName); + } + return fieldName; + } + + /** + * 解析运算符映射(eq -> =, lt -> < 等) + */ + private String parseOperator(ClauseFactor factor) { + if(factor == null) { + return "="; + } + switch (factor) { + case EQ: return "="; + case GT: return ">"; + case GE: return ">="; + case LT: return "<"; + case LE: return "<="; + case LIKE: return "LIKE"; + case NULL: return "IS NULL"; // 空值判断 + case NOT_NULL: return "IS NOT NULL"; // 非空判断 + default: throw new UnsupportedOperationException("不支持的运算符: " + factor); + } + } + + +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormFieldVo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormFieldVo.java new file mode 100644 index 0000000..73210cd --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormFieldVo.java @@ -0,0 +1,22 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +public class FormFieldVo { + private String displayName; + private Object value; + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormUpdateField.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormUpdateField.java new file mode 100644 index 0000000..cf3b073 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormUpdateField.java @@ -0,0 +1,57 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +public class FormUpdateField { + private String display; + private String fieldName; + private Object value; + + public FormUpdateField(Object value) { + this.value = value; + } + + public FormUpdateField() { + } + + public static FormUpdateField build() { + return new FormUpdateField(); + } + + public FormUpdateField display(String display) { + this.display = display; + return this; + } + + public FormUpdateField value(String value) { + this.value = value; + return this; + } + + public FormUpdateField fieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormWhereCondition.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormWhereCondition.java new file mode 100644 index 0000000..5213981 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/FormWhereCondition.java @@ -0,0 +1,121 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +public class FormWhereCondition { + private String display; + private String fieldName; //字段名 + private Object value; //值 + private ClauseFactor clauseFactor; //条件因子 eq lt gt not_null null + private ClauseFactor concatFactor = ClauseFactor.AND; //拼接因子 + private boolean startWithBracket = false; //是否以括号开头生成子条件 + private boolean endWithBracket = false; //是否以括号结尾结束子条件 + private String index; + + public FormWhereCondition() { + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public static FormWhereCondition build() { + return new FormWhereCondition(); + } + + public FormWhereCondition display(String display) { + this.display = display; + return this; + } + public FormWhereCondition value(Object value) { + this.value = value; + return this; + } + public FormWhereCondition clauseFactor(ClauseFactor clauseFactor) { + this.clauseFactor = clauseFactor; + return this; + } + public FormWhereCondition index(String index) { + this.index = index; + return this; + } + + public FormWhereCondition startWithBracket(boolean startWithBracket) { + this.startWithBracket = startWithBracket; + return this; + } + + public FormWhereCondition endWithBracket(boolean endWithBracket) { + this.endWithBracket = endWithBracket; + return this; + } + + public FormWhereCondition concatFactor(ClauseFactor concatFactor) { + this.concatFactor = concatFactor; + return this; + } + + + public FormWhereCondition(Object value, ClauseFactor clauseFactor) { + this.value = value; + this.clauseFactor = clauseFactor; + } + + public boolean isStartWithBracket() { + return startWithBracket; + } + + public void setStartWithBracket(boolean startWithBracket) { + this.startWithBracket = startWithBracket; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public ClauseFactor getClauseFactor() { + return clauseFactor; + } + + public void setClauseFactor(ClauseFactor clauseFactor) { + this.clauseFactor = clauseFactor; + } + + public ClauseFactor getConcatFactor() { + return concatFactor; + } + + public void setConcatFactor(ClauseFactor concatFactor) { + this.concatFactor = concatFactor; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public boolean isEndWithBracket() { + return endWithBracket; + } + + public void setEndWithBracket(boolean endWithBracket) { + this.endWithBracket = endWithBracket; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/HttpClient.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/HttpClient.java new file mode 100644 index 0000000..008696f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/utils/HttpClient.java @@ -0,0 +1,425 @@ +package com.seeyon.apps.src_powerfeeinvoice.utils; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @ClassName: HttpClient + * @Description: HTTP请求工具类 + * @Author: GiikJc + * @Date: 2022/7/12 15:03 + */ + +/** + * 发送Get请求:HttpResponse httpGet(String url,Map headers,String encode) + *发送Post请求,同表单Post提交:HttpResponse httpPostForm(String url,Map params, Map headers,String encode) + *发送Post Raw请求:HttpResponse httpPostRaw(String url,String stringJson,Map headers, String encode) + *发送Put Raw请求:HttpResponse httpPutRaw(String url,String stringJson,Map headers, String encode) + *发送Delete请求:HttpResponse httpDelete(String url,Map headers,String encode) + */ +public class HttpClient { + + + /** + * 发送 HTTP GET 请求下载文件 + * @param url 下载文件的 URL + * @param headers 请求头 + * @param savePath 文件保存的路径 + * @param encode 文件内容的编码 + * @return 下载成功返回 true,失败返回 false + */ + public static boolean httpDownloadFile(String url, Map headers, String savePath, String encode) { + if (encode == null) { + encode = "utf-8"; // 默认字符编码 + } + + CloseableHttpClient httpClient = null; + CloseableHttpResponse httpResponse = null; + InputStream inputStream = null; + OutputStream outputStream = null; + + try { + // 创建 HttpClient 实例 + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + + // 设置请求头 + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpGet.setHeader(entry.getKey(), entry.getValue()); + } + } + + // 执行请求 + httpResponse = httpClient.execute(httpGet); + HttpEntity entity = httpResponse.getEntity(); + + // 检查响应状态码 + if (httpResponse.getStatusLine().getStatusCode() == 200) { + inputStream = entity.getContent(); + + // 创建输出流,将文件保存到本地 + outputStream = new FileOutputStream(savePath); + + // 设置缓冲区 + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + // 文件下载成功 + return true; + } else { + System.out.println("Download failed, HTTP error code: " + httpResponse.getStatusLine().getStatusCode()); + return false; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + try { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + if (httpResponse != null) { + httpResponse.close(); + } + if (httpClient != null) { + httpClient.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 发送http get请求 + */ + public static String httpGet(String url,Map headers,String encode){ + + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + closeableHttpClient = HttpClientBuilder.create().build(); + HttpGet httpGet = new HttpGet(url); + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpGet.setHeader(entry.getKey(),entry.getValue()); + } + } + + httpResponse = closeableHttpClient.execute(httpGet); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + /** + * 发送 http post 请求,参数以form表单键值对的形式提交。 + */ + public static String httpPostForm(String url,Map params, Map headers,String encode){ + + if(encode == null){ + encode = "utf-8"; + } + + String content = null; + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + try { + + closeableHttpClient = HttpClients.createDefault(); + HttpPost httpost = new HttpPost(url); + + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpost.setHeader(entry.getKey(),entry.getValue()); + } + } + //组织请求参数 + List paramList = new ArrayList (); + if(params != null && params.size() > 0){ + Set keySet = params.keySet(); + for(String key : keySet) { + paramList.add(new BasicNameValuePair(key, params.get(key))); + } + } + httpost.setEntity(new UrlEncodedFormEntity(paramList, encode)); + + + httpResponse = closeableHttpClient.execute(httpost); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + /** + * 发送 http post 请求,参数以原生字符串进行提交 + * @param url + * @param encode + * @return + */ + public static String httpPostRaw(String url,String stringJson,Map headers, String encode){ + if(encode == null){ + encode = "utf-8"; + } + String content = null; + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + try { + + //HttpClients.createDefault()等价于 HttpClientBuilder.create().build(); + closeableHttpClient = HttpClients.createDefault(); + HttpPost httpost = new HttpPost(url); + + //设置header + httpost.setHeader("Content-type", "application/json"); + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpost.setHeader(entry.getKey(),entry.getValue()); + } + } + //组织请求参数 + StringEntity stringEntity = new StringEntity(stringJson, encode); + httpost.setEntity(stringEntity); + + + //响应信息 + httpResponse = closeableHttpClient.execute(httpost); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + /** + * 发送 http put 请求,参数以原生字符串进行提交 + * @param url + * @param encode + * @return + */ + public static String httpPutRaw(String url,String stringJson,Map headers, String encode){ + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + + //HttpClients.createDefault()等价于 HttpClientBuilder.create().build(); + closeableHttpClient = HttpClients.createDefault(); + HttpPut httpput = new HttpPut(url); + + //设置header + httpput.setHeader("Content-type", "application/json"); + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpput.setHeader(entry.getKey(),entry.getValue()); + } + } + //组织请求参数 + StringEntity stringEntity = new StringEntity(stringJson, encode); + httpput.setEntity(stringEntity); + //响应信息 + httpResponse = closeableHttpClient.execute(httpput); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + closeableHttpClient.close(); //关闭连接、释放资源 + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + /** + * 发送http delete请求 + */ + public static String httpDelete(String url,Map headers,String encode){ + if(encode == null){ + encode = "utf-8"; + } + String content = null; + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + try { + //since 4.3 不再使用 DefaultHttpClient + closeableHttpClient = HttpClientBuilder.create().build(); + HttpDelete httpdelete = new HttpDelete(url); + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpdelete.setHeader(entry.getKey(),entry.getValue()); + } + } + + httpResponse = closeableHttpClient.execute(httpdelete); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + + /** + * 发送 http post 请求,支持文件上传 + */ + public static String httpPostFormMultipart(String url,Map params, List files,Map headers,String encode){ + if(encode == null){ + encode = "utf-8"; + } + CloseableHttpResponse httpResponse = null; + CloseableHttpClient closeableHttpClient = null; + String content = null; + //since 4.3 不再使用 DefaultHttpClient + try { + + closeableHttpClient = HttpClients.createDefault(); + HttpPost httpost = new HttpPost(url); + + //设置header + if (headers != null && headers.size() > 0) { + for (Map.Entry entry : headers.entrySet()) { + httpost.setHeader(entry.getKey(),entry.getValue()); + } + } + MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create(); + mEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + mEntityBuilder.setCharset(Charset.forName(encode)); + + // 普通参数 + ContentType contentType = ContentType.create("text/plain",Charset.forName(encode));//解决中文乱码 + if (params != null && params.size() > 0) { + Set keySet = params.keySet(); + for (String key : keySet) { + mEntityBuilder.addTextBody(key, params.get(key),contentType); + } + } + //二进制参数 + if (files != null && files.size() > 0) { + for (File file : files) { + mEntityBuilder.addBinaryBody("file", file); + } + } + httpost.setEntity(mEntityBuilder.build()); + httpResponse = closeableHttpClient.execute(httpost); + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity, encode); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { //关闭连接、释放资源 + closeableHttpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeInvoiceInfo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeInvoiceInfo.java new file mode 100644 index 0000000..8b2aa6a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeInvoiceInfo.java @@ -0,0 +1,131 @@ +package com.seeyon.apps.src_powerfeeinvoice.vo; + +public class PowerFeeInvoiceInfo { + private Object price; //单价 + private Object totalPrice; //总金额 + private String orderTradeNo; //订单请求流水号 + private String orderNo; //订单号 + private String reqNo; //请求批次号 + private String buyerTaxNo; //买方税号 + private String buyer; //买方名称 + private String sellerTaxNo; //卖方税号 + private String sellerName; //卖方名称 + private String customerNo; //客户号 + private String buyerPhone; //手机号 + private String invoicer; //开票人 + private String remark; //备注 + private Object ddsj; //订单时间 + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + + public String getInvoicer() { + return invoicer; + } + + public void setInvoicer(String invoicer) { + this.invoicer = invoicer; + } + + public Object getDdsj() { + return ddsj; + } + + public void setDdsj(Object ddsj) { + this.ddsj = ddsj; + } + + public Object getPrice() { + return price; + } + + public void setPrice(Object price) { + this.price = price; + } + + public Object getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(Object totalPrice) { + this.totalPrice = totalPrice; + } + + public String getOrderTradeNo() { + return orderTradeNo; + } + + public void setOrderTradeNo(String orderTradeNo) { + this.orderTradeNo = orderTradeNo; + } + + public String getBuyerTaxNo() { + return buyerTaxNo; + } + + public void setBuyerTaxNo(String buyerTaxNo) { + this.buyerTaxNo = buyerTaxNo; + } + + public String getBuyer() { + return buyer; + } + + public void setBuyer(String buyer) { + this.buyer = buyer; + } + + public String getSellerTaxNo() { + return sellerTaxNo; + } + + public void setSellerTaxNo(String sellerTaxNo) { + this.sellerTaxNo = sellerTaxNo; + } + + public String getSellerName() { + return sellerName; + } + + public void setSellerName(String sellerName) { + this.sellerName = sellerName; + } + + public String getCustomerNo() { + return customerNo; + } + + public void setCustomerNo(String customerNo) { + this.customerNo = customerNo; + } + + public String getBuyerPhone() { + return buyerPhone; + } + + public void setBuyerPhone(String buyerPhone) { + this.buyerPhone = buyerPhone; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getReqNo() { + return reqNo; + } + + public void setReqNo(String reqNo) { + this.reqNo = reqNo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeQueryVo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeQueryVo.java new file mode 100644 index 0000000..11b1c8a --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeQueryVo.java @@ -0,0 +1,35 @@ +package com.seeyon.apps.src_powerfeeinvoice.vo; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public class PowerFeeQueryVo implements Serializable { + private List queryColumnVos; + private Map conditionVos; + private String formNo; + + public List getQueryColumnVos() { + return queryColumnVos; + } + + public void setQueryColumnVos(List queryColumnVos) { + this.queryColumnVos = queryColumnVos; + } + + public Map getConditionVos() { + return conditionVos; + } + + public void setConditionVos(Map conditionVos) { + this.conditionVos = conditionVos; + } + + public String getFormNo() { + return formNo; + } + + public void setFormNo(String formNo) { + this.formNo = formNo; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeUpdateVo.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeUpdateVo.java new file mode 100644 index 0000000..bf6e771 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_powerfeeinvoice/vo/PowerFeeUpdateVo.java @@ -0,0 +1,36 @@ +package com.seeyon.apps.src_powerfeeinvoice.vo; + +import com.seeyon.apps.src_powerfeeinvoice.utils.FormUpdateField; + +import java.io.Serializable; +import java.util.Map; + +public class PowerFeeUpdateVo implements Serializable { + private Long id; + private Map updateFieldVos; + private String formNo; + + public Map getUpdateFieldVos() { + return updateFieldVos; + } + + public void setUpdateFieldVos(Map updateFieldVos) { + this.updateFieldVos = updateFieldVos; + } + + public String getFormNo() { + return formNo; + } + + public void setFormNo(String formNo) { + this.formNo = formNo; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/NcSync2OaDbResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/NcSync2OaDbResource.java new file mode 100644 index 0000000..aa1c114 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/NcSync2OaDbResource.java @@ -0,0 +1,103 @@ +package com.seeyon.ctp.rest.resources; + +import com.seeyon.apps.addressbook.manager.AddressBookCustomerFieldInfoManager; +import com.seeyon.apps.addressbook.po.AddressBook; +import com.seeyon.apps.bipsync.aop.NcHrSynAspect; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.OrgConstants; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.Strings; +import org.apache.commons.logging.Log; + +import javax.ws.rs.*; +import javax.ws.rs.core.Response; +import java.util.Date; +import java.util.List; + +@Path("/nc/oa") +@Produces({"application/json", "application/xml"}) +public class NcSync2OaDbResource extends BaseResource{ + private static final Log log = CtpLogFactory.getLog(NcSync2OaDbResource.class); + + + private AddressBookCustomerFieldInfoManager addressBookCustomerFieldInfoManager; + private OrgManager orgManager; + + + @Path("/sync") + @GET + public Response syncData(){ + try { + NcHrSynAspect ncHrSynAspect = (NcHrSynAspect) AppContext.getBean("ncHrSynAspect"); + ncHrSynAspect.after(null,null); + return success("同步成功!"); + }catch (Exception e){ + log.error("同步异常",e); + return fail("同步失败!"+e.getMessage()); + } + } + + @GET + @Path("/init") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response init(@QueryParam("init") String init){ + int success = 0; + boolean override = "1".equals(init); + int fail = 0; + try { + V3xOrgAccount rootAccount = getOrgManager().getRootAccount(); + List memberList = getOrgManager().getAllMembers(rootAccount.getId(), true); + for (V3xOrgMember member : memberList) { + try { + AddressBook book = null; + book = getAddressBookCustomerFieldInfoManager().getByMemberId(member.getId()); + if(null == book) { + book = new AddressBook(); + book.setIdIfNew(); + book.setCreateDate(new Date()); + book.setUpdateDate(new Date()); + book.setMemberId(member.getId()); + book.setType(OrgConstants.ORGENT_TYPE.Member.name()); + if(Strings.isNotBlank(member.getCode())) { + book.setExtAttr2(member.getCode()); + getAddressBookCustomerFieldInfoManager().addAddressBook(book); + } + } else { + // 覆盖或者本身就是空 + if((override || Strings.isBlank(book.getExtAttr2())) && Strings.isNotBlank(member.getCode())) { + book.setExtAttr2(member.getCode()); + getAddressBookCustomerFieldInfoManager().updateAddressBook(book); + } + } + success++; + } catch (Exception e) { + log.error("获取人员扩展字段发生错误:", e); + fail++; + } + } + } catch (Exception e) { + log.error("初始化字段异常:", e); + return fail("初始化异常,请查看日志"); + } + return success("成功:" + success + "个,失败:" + fail + "个", "初始化成功"); + } + + private AddressBookCustomerFieldInfoManager getAddressBookCustomerFieldInfoManager() { + if(null == addressBookCustomerFieldInfoManager) { + addressBookCustomerFieldInfoManager = (AddressBookCustomerFieldInfoManager) AppContext.getBean("addressBookCustomerFieldInfoManager"); + } + return addressBookCustomerFieldInfoManager; + } + + private OrgManager getOrgManager() { + if(null == orgManager) { + orgManager = (OrgManager) AppContext.getBean("orgManager"); + } + return orgManager; + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/PowerFeeController.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/PowerFeeController.java new file mode 100644 index 0000000..777fffb --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/PowerFeeController.java @@ -0,0 +1,35 @@ +package com.seeyon.ctp.rest.resources; + +import com.seeyon.apps.src_powerfeeinvoice.service.PowerFeeService; +import com.seeyon.apps.src_powerfeeinvoice.vo.PowerFeeUpdateVo; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.log.CtpLogFactory; +import org.apache.commons.logging.Log; + + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + + +@Path("/powerfee") +@Produces({"application/json", "application/xml"}) +public class PowerFeeController extends BaseResource { + private static final Log log = CtpLogFactory.getLog(PowerFeeController.class); + private PowerFeeService powerFeeService = (PowerFeeService) AppContext.getBean("powerFeeService"); + + + @POST + @Path("/callback") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response callBack(PowerFeeUpdateVo updateVo) { + try { + return success("回写开票信息成功"); + }catch (Exception e) { + return fail(e.getMessage()); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/PushOrderInfoAndInvoiceInfoResource.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/PushOrderInfoAndInvoiceInfoResource.java new file mode 100644 index 0000000..021cf6f --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/PushOrderInfoAndInvoiceInfoResource.java @@ -0,0 +1,57 @@ +package com.seeyon.ctp.rest.resources; + + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_gettaxrate.dao.IGetTaxRateDao; +import com.seeyon.apps.src_hxinvoice.service.IInvoiceService; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.log.CtpLogFactory; +import org.apache.commons.logging.Log; + +import javax.ws.rs.*; +import javax.ws.rs.core.Response; + +@Path("/nc/oa") +@Produces({"application/json", "application/xml"}) +public class PushOrderInfoAndInvoiceInfoResource extends BaseResource{ + + private static final Log log = CtpLogFactory.getLog(PushOrderInfoAndInvoiceInfoResource.class); + + private IInvoiceService invoiceServiceImpl; + + + public IInvoiceService getInvoiceService() { + if (this.invoiceServiceImpl == null) { + this.invoiceServiceImpl = ((IInvoiceService) AppContext.getBean("invoiceServiceImpl")); + } + return invoiceServiceImpl; + } + public void setInvoiceService(IInvoiceService invoiceServiceImpl) { + this.invoiceServiceImpl = invoiceServiceImpl; + } + + @POST + @Path("/PushOrderInfoAndInvoiceInfo") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response getData(JSONObject param){ + + JSONObject res = null; + try { +// res = getInvoiceService().PushOrderInfoAndInvoiceInfoService(param); + res = new JSONObject(); + } catch (Exception e) { + e.printStackTrace(); + } + +// JSONObject res = new JSONObject(); +// res.put("returnCode", "000000"); +// res.put("returnMessage", "接口请求成功"); +// res.put("dataExchangeId", "20241205"); +// res.put("encryptCode", "1"); +// res.put("zipCode", "1"); +// res.put("content", "H4sIAAAAAAAAAAFIALf/B5xnO3ULeQNgSjuFauMdBOYwfy6UkGLG3sLMKr2KhOokVQG1Br3ytpbHu3/Wj+K85zdBVSo9cPf86lGBR5UAQ2O/HluFvmlKuGFbp0gAAAA="); + return ok(res); + } + +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/getTaxRateResources.java b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/getTaxRateResources.java new file mode 100644 index 0000000..f2bb6c1 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/ctp/rest/resources/getTaxRateResources.java @@ -0,0 +1,55 @@ +package com.seeyon.ctp.rest.resources; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Response; + +import org.apache.commons.logging.Log; + +import com.seeyon.apps.src_gettaxrate.dao.IGetTaxRateDao; +import com.seeyon.apps.src_gettaxrate.util.CommonResult; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.log.CtpLogFactory; + +/** +* @author zhaoyang: +* @version 创建时间:2024年11月30日 下午9:08:23 +* 类说明 根据纳税人识别号、税目 ,去获取税率 +*/ +@Path("/nc/oa") +@Produces({"application/json", "application/xml"}) +public class getTaxRateResources extends BaseResource { + + private static final Log log = CtpLogFactory.getLog(getTaxRateResources.class); + private IGetTaxRateDao gettaxrateDao; + + + public IGetTaxRateDao getIGetTaxRateDao() { + if (this.gettaxrateDao == null) { + this.gettaxrateDao = ((IGetTaxRateDao) AppContext.getBean("gettaxrateDao")); + } + return gettaxrateDao; + } + public void setIGetF9WagesDao(IGetTaxRateDao getwagesDao) { + this.gettaxrateDao = getwagesDao; + } + + + @GET + @Path("/gettaxdata") + @Produces({"application/json"}) + @Consumes({"application/json"}) + public Response getData(@QueryParam("taxnum") String taxnum,@QueryParam("taxtype") String taxtype){ + CommonResult result = getIGetTaxRateDao().getTaxRateExecute2(taxnum, taxtype); + if("success".equals(result.getStatusCode())) { + return success(result.getData(),"税率查询成功"); + }else { + return fail("税率查询失败: "+result.getMessage()); + } + } + +} diff --git a/v5/apps-customize/src/main/resources/needless_check_login.xml b/v5/apps-customize/src/main/resources/needless_check_login.xml new file mode 100644 index 0000000..97114bc --- /dev/null +++ b/v5/apps-customize/src/main/resources/needless_check_login.xml @@ -0,0 +1,322 @@ + + + + /qrCodeForm.do + + index + newMain + + + + /sc.do + + qr + + + + /elearning.do + + error + m3Redirect + message + pcRedirect + + + + /phoneLogin/phoneLogin.do + + getMessageCode + validateMessageCode + + + + /wechat/miniprogram.do + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + + showThemSpace + + + + /identification.do + + getSessionId + + + + /fileUpload.do + + showRTE + + + + /fileDownload.do + + showRTE + + + + /form/formUpgrade.do + + toUpgrade + upgrade + viewUpgrade + + + + formtalkFormMapperController.do + + importFormtalkData + + + + /thirdpartyController.do + + access + index + logoutNotify + show + mailAuth + + + + /main.do + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + + index + + + + /genericController.do + + index + + + + /edoc/edocUpgradeControllor.do + + upgrade + download + + + + /uploadService.do + + processUploadService + + + + /autoinstall.do + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + /personalBind.do + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + + + + + + + + /commonimage.do + + showImage + + + + /individualManager.do + + resetPassword + + + + /wechat/dingding.do + + binding + index + main + newIndex + newMain + viewh5Message + + + + /uc/rest.do + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + portalManager + + sendSMSLoginCode + smsLoginEnabled + + + + loginUserManager + + getLockTime + + + + qrCodeLoginManager + + isLogin + + + + meetingAjaxManager + + meetingPanelData + meetingPanelDisplay + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /m3/mClientBindController.do + + bindApply + + + + m3ProductManager + + productInfo + productStatus + + + + /m3/homeSkinController.do + + downloadImage + getSkinImageUrl + + + + /m3/transModeController.do + + getTransModeForMobile + + + + /media/media.do + + mediaShow + + + + /ocipEdoc.do + + index + + + + /colView.do + + index + + + + /caAccountManagerController.do + + findKeyNumByLoginName + + + + /fddCallbackController.do + + asynch + synch + + + + /seeyonReport/seeyonReportController.do + + redirectSeeyonReport + + + + /imc.do + + index + logout + + + + + /cloudbuild.do + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/resources/needless_check_login_recheck.xml b/v5/apps-customize/src/main/resources/needless_check_login_recheck.xml new file mode 100644 index 0000000..0e84aeb --- /dev/null +++ b/v5/apps-customize/src/main/resources/needless_check_login_recheck.xml @@ -0,0 +1,426 @@ + + + + + + /qrCodeForm.do + com.seeyon.apps.qrCodeForm.controller.QrCodeFormController + + index + newMain + + + + + /sc.do + com.seeyon.cap4.form.modules.smartCode.controller.SmartCodeController + + qr + + + + /media/media.do + com.seeyon.ctp.common.media.controller.MediaController + + mediaShow + + + + /phoneLogin/phoneLogin.do + com.seeyon.ctp.login.controller.PhoneLoginController + + getMessageCode + validateMessageCode + + + + portalManager + com.seeyon.ctp.portal.manager.PortalManagerImpl + + sendSMSLoginCode + smsLoginEnabled + + + + /fileDownload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + + + + loginUserManager + com.seeyon.ctp.login.LoginUserManagerImpl + + getLockTime + + + + /main.do + com.seeyon.ctp.login.controller.MainController + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + com.seeyon.apps.trustdo.controller.XRDController + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + com.seeyon.v3x.system.share.controller.ShareController + + index + + + + /edoc/edocUpgradeControllor.do + com.seeyon.v3x.edoc.controller.EdocUpgradeControllor + + upgrade + download + + + + /m3/mClientBindController.do + com.seeyon.apps.m3.bind.controller.M3ClientBindController + + bindApply + + + + /uploadService.do + com.seeyon.ctp.services.FileUploadService + + processUploadService + + + + /uc/rest.do + com.seeyon.apps.zx.controller.ZxRestController + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + /m3/homeSkinController.do + com.seeyon.apps.m3.skin.controller.M3HomeSkinController + + downloadImage + getSkinImageUrl + + + + /colView.do + com.seeyon.apps.ocip.exchange.collaboration.controller.CollViewController + + index + + + + /autoinstall.do + com.seeyon.apps.autoinstall.controller.AutoInstallController + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + + + + + + + + + /caAccountManagerController.do + com.seeyon.v3x.ca.caaccount.controller.CAAccountManagerController + + findKeyNumByLoginName + + + + /elearning.do + com.seeyon.apps.elearning.controller.ElearningController + + error + m3Redirect + message + pcRedirect + + + + /wechat/miniprogram.do + com.seeyon.apps.weixin.controller.MiniProgramController + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + com.seeyon.ctp.portal.space.controller.SpaceController + + showThemSpace + + + + /identification.do + com.seeyon.v3x.identification.controller.IdentificationController + + getSessionId + + + + /fddCallbackController.do + com.seeyon.apps.econtract.fdd.controller.FddCallbackController + + asynch + synch + + + + m3ProductManager + com.seeyon.apps.m3.product.manager.impl.M3ProductManagerImpl + + productInfo + productStatus + + + + /ocipEdoc.do + com.seeyon.apps.ocip.exchange.edoc.OCIPEdocController + + index + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /fileUpload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + processUpload + + + + qrCodeLoginManager + com.seeyon.ctp.login.manager.QrCodeLoginManagerImpl + + isLogin + + + + /form/formUpgrade.do + com.seeyon.ctp.form.service.FormUpgradeController + + toUpgrade + upgrade + viewUpgrade + + + + /seeyonReport/seeyonReportController.do + com.seeyon.apps.seeyonreport.controller.SeeyonReportController + + redirectSeeyonReport + + + + formtalkFormMapperController.do + com.seeyon.apps.formtalk.controller.FormtalkImportController + + importFormtalkData + + + + /thirdpartyController.do + com.seeyon.ctp.portal.sso.thirdpartyintegration.controller.ThirdpartyController + + access + index + logoutNotify + show + mailAuth + + + + /m3/transModeController.do + com.seeyon.apps.m3.transmissionmode.controller.M3TransModeController + + getTransModeForMobile + + + + /genericController.do + com.seeyon.v3x.common.controller.GenericController + + index + + + + /personalBind.do + com.seeyon.v3x.personalaffair.controller.PersonalBindController + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + /commonimage.do + com.seeyon.apps.common.image.controller.ImageController + + showImage + + + + /individualManager.do + com.seeyon.v3x.personalaffair.controller.IndividualManagerController + + resetPassword + + + + meetingAjaxManager + com.seeyon.apps.meeting.manager.MeetingAjaxManagerImpl + + meetingPanelData + meetingPanelDisplay + + + + /wechat/dingding.do + com.seeyon.apps.weixin.controller.DingDingController + + binding + index + main + newIndex + newMain + viewh5Message + + + + /imc.do + com.seeyon.apps.imc.controller.ImcLoginController + + index + logout + + + + /wechat/feishu.do + com.seeyon.apps.weixin.controller.FeishuController + + newMain + viewh5Message + + + + + + + + + + + + + + + /wechat/pcapp.do + com.seeyon.apps.weixin.controller.PcAppController + + transferPageFromWxCoreServer + gotoPcApp + checkCodeTurnToRightPage + transfer + transferMsg + + + + /wechat/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /zhifei/feishu.do + com.seeyon.apps.zhifei.controller.FeishuController + + newMain + viewh5Message + + + + /zhifei/pcapp.do + com.seeyon.apps.zhifei.controller.ZhifeiPcAppController + + transferPageFromWxCoreServer + gotoPcApp + + + + /zhifei/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /cloudbuild.do + com.seeyon.apps.cloudbuild.controller.CloudBuildController + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + diff --git a/v5/apps-customize/src/main/webapp/H5/ordinary/css/formQueryBtn.css b/v5/apps-customize/src/main/webapp/H5/ordinary/css/formQueryBtn.css new file mode 100644 index 0000000..ae96722 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/H5/ordinary/css/formQueryBtn.css @@ -0,0 +1,27 @@ +.customButton_class_box { + width: 100%; + line-height: 24px; + height:24px; + color: #1f85ec; + cursor: pointer; + font-family: "Microsoft YaHei"!important; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break:keep-all; +} +.customButton_box_content{ + width: 100%; + height: 24px; + box-sizing: border-box; + -webkit-box-sizing : border-box; + -moz-box-sizing : border-box; + text-align: center; + outline: none; + border: 1px solid #1f85ec; + background-color: #fff; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; +} + diff --git a/v5/apps-customize/src/main/webapp/H5/ordinary/css/img/icon16.png b/v5/apps-customize/src/main/webapp/H5/ordinary/css/img/icon16.png new file mode 100644 index 0000000..e43def3 Binary files /dev/null and b/v5/apps-customize/src/main/webapp/H5/ordinary/css/img/icon16.png differ diff --git a/v5/apps-customize/src/main/webapp/H5/ordinary/css/setCondition.css b/v5/apps-customize/src/main/webapp/H5/ordinary/css/setCondition.css new file mode 100644 index 0000000..6e08db4 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/H5/ordinary/css/setCondition.css @@ -0,0 +1,13 @@ +.relation_container .panel_bottom .zidong_guanlian .guanlian_map{ + padding-left: 10px; +} +.relation_container .panel_bottom .zidong_guanlian .guanlian_map .error-title{ + margin: 0 2px; + visibility: hidden; +} +.relation_container .panel_bottom .zidong_guanlian .guanlian_map .error-title.active{ + visibility: visible; +} +.relation_container .biz_groupguanlian .div_sel3.active{ + border-color: red; +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/H5/ordinary/js/ordinary.js b/v5/apps-customize/src/main/webapp/H5/ordinary/js/ordinary.js new file mode 100644 index 0000000..91d85dd --- /dev/null +++ b/v5/apps-customize/src/main/webapp/H5/ordinary/js/ordinary.js @@ -0,0 +1,208 @@ +(function () { + var scopeName = "field_6903530450190094319"; + + var ContractNoImpl = function (options) { + this.customWidgetType = scopeName; + this._create(options); + }; + + ContractNoImpl.prototype = { + constructor: ContractNoImpl, + + _create: function (options) { + this._options = options; + this._widgetId = options.privateId; + this._widgetProxy = options.adaptation; + this._wrapper = document.getElementById(this._widgetId); + this._field = this._widgetProxy.childrenGetData(this._widgetId); + this._tunnelId = 'Event' + this._widgetId; + + if (!this._wrapper) return console.warn('没有找到组件渲染的容器'); + + this.clicked = 0; + this._update(); + }, + + _update: function (field) { + if (field) this._field = field; + this._destroy(); + this._buildRendering(); + this._postCreate(); + }, + + _buildRendering: function () { + var elemId = 'section-' + this._widgetId; + var btnId = 'section-' + this._widgetId + '-btn'; + var tpl = '
' + + '' + + '
'; + + this._wrapper.innerHTML = tpl; + this._el = this._wrapper.querySelector('#' + elemId); + this._btnEl = this._wrapper.querySelector('#' + btnId); + }, + + _postCreate: function () { + this._fieldElement = this._wrapper.querySelector('.field0313__'); + + if (this._fieldElement) { + this._unbindTouchStart = this._bind(this._fieldElement, 'touchstart', this.onTouchStart.bind(this)); + this._unbindTouchEnd = this._bind(this._fieldElement, 'touchend', this.onTouchEnd.bind(this)); + this._unbindTouchMove = this._bind(this._fieldElement, 'touchmove', this.onTouchMove.bind(this)); + } + + this._unbindTap = this._bind(this._btnEl, 'click', this.onClick.bind(this)); // 改为 click + this._unbindUpdate = this._listen(this._tunnelId, this._update.bind(this)); + }, + + _destroy: function () { + if (this._fieldElement) { + this._unbindTouchStart && this._unbindTouchStart(); + this._unbindTouchEnd && this._unbindTouchEnd(); + this._unbindTouchMove && this._unbindTouchMove(); + } + this._unbindTap && this._unbindTap(); + this._unbindUpdate && this._unbindUpdate(); + this._el = this._btnEl = this._fieldElement = null; + }, + + _bind: function (el, evt, cb) { + el.addEventListener(evt, cb, false); + return function () { + el.removeEventListener(evt, cb, false); + }; + }, + + _listen: function (evt, cb) { + var hub = this._widgetProxy.ObserverEvent; + hub.listen(evt, cb); + return function () { + hub.remove(evt, cb); + }; + }, + + onTouchStart: function () { + if (this._fieldElement) { + this._fieldElement.style.backgroundColor = "#005297"; + } + }, + + onTouchEnd: function () { + if (this._fieldElement) { + this._fieldElement.style.backgroundColor = "#008BFF"; + } + }, + + onTouchMove: function () { + if (this._fieldElement) { + this._fieldElement.style.backgroundColor = "#005297"; + } + }, + + onClick: function () { + var tableName = this._options.formMessage.tableName; + var formmains = this._options.getData.formdata.formmains[tableName]; + var tableMap = formmains.elements; + var contractNo = '', ncCorpCode = '', djNo = '', bipResult = ''; + const keys = Object.keys(tableMap); + + keys.forEach((k) => { + let display = tableMap[k].display; + let value = tableMap[k].value; + if (display === '自动生成合同编号') contractNo = value; + if (display === 'NC公司编码') ncCorpCode = value; + if (display === '单据编号') djNo = value; + if (display === 'BIP返回结果') bipResult = value; + }); + if (bipResult.includes("推送BIP成功")) { + alert("当前合同已成功推送BIP系统,禁止重复生成合同编号"); + return; + } + + var proceed = true; + if (contractNo !== '') { + proceed = confirm('当前合同已经存在合同编号是否选择变更!'); + } + + if (ncCorpCode === '') { + alert("合同主体编号为空,填写合同主体编号"); + return; + } + + if(proceed){ + cmp.ajax({ + url: 'https://oa.hbsxly.com/seeyon/servlet/ordinaryCodeServlet?unitCode='+ncCorpCode+"&oanum="+djNo, + type: 'POST', + data: { + "unitCode": ncCorpCode, + "oanum": djNo + }, + success: function(data) { + if (data.isSucceed === "200") { + alert("生成成功"); + formmains.elements["field0249"].value = data.newCode; // 请确认 field0249 是你实际的字段key + } else if (data.isSucceed === "500") { + alert(data.msg); + } else { + alert("生成失败,请联系管理员"); + } + }, + error: function(e) { + alert('接口异常,异常对象为:', e); + } + }); + } + + + // if (proceed) { + // // const url = `${window.location.origin}/seeyon/servlet/ordinaryCodeServlet`; + // const url = 'seeyon/servlet/ordinaryCodeServlet' + // const params = new URLSearchParams({ + // unitCode: ncCorpCode, + // oanum: djNo + // }); + // + // fetch(url, { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/x-www-form-urlencoded' + // }, + // body: params.toString() + // }) + // .then(response => response.json()) + // .then(data => { + // if (data.isSucceed === "200") { + // formmains.elements["field0249"].value = data.newCode; // 请确认 field0249 是你实际的字段key + // } else if (data.isSucceed === "500") { + // alert(data.msg); + // } else { + // alert("生成失败,请联系管理员"); + // } + // }) + // .catch(() => { + // alert("跳转失败,请联系管理员"); + // }); + // } + // + + + + this._update(); + } + }; + + var myWidgets = {}; + + ContractNoImpl.init = function (options) { + var widget = new ContractNoImpl(options); + myWidgets[widget._widgetId] = widget; + }; + + ContractNoImpl.destroy = function (widgetId) { + var widget = myWidgets[widgetId]; + if (widget) widget._destroy(); + delete myWidgets[widgetId]; + }; + + window[scopeName] = ContractNoImpl; +})(); diff --git a/v5/apps-customize/src/main/webapp/H5/ordinary/manifest.json b/v5/apps-customize/src/main/webapp/H5/ordinary/manifest.json new file mode 100644 index 0000000..348a789 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/H5/ordinary/manifest.json @@ -0,0 +1,25 @@ +{ + "buildVersion":"1.0.0", + "iconFiles":{"default":"","multi":[]}, + "appName":"ordinary", + "splashscreen":[], + "update":{"checkUpdateUrl":""}, + "bundleIdentifier":"", + "serviceProvidear":"seeyon", + "team":"v5", + "cmpShellVersion":{"ios":"1.0.0","android":"1.0.0"}, + "packageType":"LIB", + "version":"1.0.0", + "entry":{ + "phone":"", + "jsapi":"ordinary_m_api.s3js", + "openAppMethod":"" + }, + "compatibleVersion":["1.0.0","1.0.1","2.0.0"], + "appType":"default", + "appId":"901", + "urlSchemes":"ordinary.v5.cmp", + "bundleName":"ordinary", + "supportedPlatforms":["iOS_6.0","android_4.0"], + "desc":"合同编号生成自定义按钮" +} diff --git a/v5/apps-customize/src/main/webapp/H5/ordinary/ordinary_m_api.s3js b/v5/apps-customize/src/main/webapp/H5/ordinary/ordinary_m_api.s3js new file mode 100644 index 0000000..f49f564 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/H5/ordinary/ordinary_m_api.s3js @@ -0,0 +1,5 @@ +var newWidgetApi = (function() { + var newWidgetApi = function() { + this.basePath = "http://ordinary.v5.cmp/v1.0.0"; + } +})(); diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/pluginCfg.xml new file mode 100644 index 0000000..4e3fb11 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/pluginCfg.xml @@ -0,0 +1,6 @@ + + + bip + NCC BIP集成 + 20221111 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-bip.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-bip.xml new file mode 100644 index 0000000..139dfd0 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-bip.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-ctrl.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-ctrl.xml new file mode 100644 index 0000000..ae3ce1b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-ctrl.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-node.xml new file mode 100644 index 0000000..f21f2f9 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bip/spring/spring-node.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bipsync/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bipsync/pluginCfg.xml new file mode 100644 index 0000000..3a1e7f7 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bipsync/pluginCfg.xml @@ -0,0 +1,6 @@ + + + bipsync + 组织架构同步 + 20230302 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bipsync/spring/spring-aop.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bipsync/spring/spring-aop.xml new file mode 100644 index 0000000..decee2e --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/bipsync/spring/spring-aop.xml @@ -0,0 +1,7 @@ + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml new file mode 100644 index 0000000..c12ee18 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/pluginCfg.xml @@ -0,0 +1,6 @@ + + + qrCodeForm + 二维码扫码填单 + 20220422 + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml new file mode 100644 index 0000000..93d89e1 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-controller.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml new file mode 100644 index 0000000..7d6233b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-manager.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml new file mode 100644 index 0000000..de1e69f --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/qrCodeForm/spring/spring-qrCodeForm-plugin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/nczc.properties b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/nczc.properties new file mode 100644 index 0000000..a5329ce --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/nczc.properties @@ -0,0 +1,7 @@ +#serviceUrl=http://192.168.0.9/uapws/service/Oa2NcService + + +# \u4efb\u52a1\u6267\u884c\u65f6\u95f4 I:00,30 D:03,00 +taskTime=I-00,05 + +#deptNo= \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/pluginCfg.xml new file mode 100644 index 0000000..670f322 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_automatic + 定时任务创建 + 20210929 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-ctrl.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-ctrl.xml new file mode 100644 index 0000000..e625055 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-ctrl.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-dao.xml new file mode 100644 index 0000000..8fa81c2 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-dao.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-service.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-service.xml new file mode 100644 index 0000000..eb17012 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-service.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-task.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-task.xml new file mode 100644 index 0000000..89a12f4 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-task.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-test.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-test.xml new file mode 100644 index 0000000..c475261 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/spring/spring-test.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/zlhtform.txt b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/zlhtform.txt new file mode 100644 index 0000000..86e0758 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_automatic/zlhtform.txt @@ -0,0 +1 @@ +${客商名称},您好!您承租的${出租单元名称},欠缴金额:${欠款金额}元。请在约定的时间前支付以上款项。详情请咨询${短信内容咨询部门}。 \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/BIPcontract.properties b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/BIPcontract.properties new file mode 100644 index 0000000..5f42e45 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/BIPcontract.properties @@ -0,0 +1,40 @@ +profile=prod +#prod.leaseUrl=http://10.1.10.21:9082/service/sxly_oa_fct_receivecontract +#prod.leasrProceedsUrl=http://10.1.10.21:9082/service/sxly_oa_arap_gatherbill +#prod.updateleasrUrl=http://10.1.10.21:9082/service/sxly_oa_fct_changecontract +#prod.paymentplandetailUrl=http://10.1.10.21:9082/service/sxly_oa_fct_paymentplandetail +#prod.leasrTerminationUrl=http://10.1.10.21:9082/service/sxly_oa_fct_terminationcontract +#prod.leasrTerminationfkUrl=http://10.1.10.21:9082/service/sxly_oa_fct_terminationfkcontract +#prod.leasrDerateUrl=http://10.1.10.21:9082/service/sxly_oa_fct_deratecontracy +#prod.fctChangeplandetailUrl=http://10.1.10.21:9082/service/sxly_oa_fct_changeplandetail +#prod.receivecontractUrl=http://10.1.10.21:9082/service/sxly_oa_fct_general_receivecontract +#prod.paymentcontractUrl=http://10.1.10.21:9082/service/sxly_oa_fct_general_paymentcontract +#prod.htpaybillServletUrl=http://10.1.10.21:9082/service/sxly_oa_arap_htpaybillServlet +#prod.terminationcontractUrl=http://10.1.10.21:9082/service/sxly_oa_fct_terminationcontract +#prod.terminationfkcontractUrl=http://10.1.10.21:9082/service/sxly_oa_fct_terminationfkcontract +#prod.paybillServletUrl=http://10.1.10.21:9082/service/sxly_oa_paybillServlet + +prod.leaseUrl=http://10.1.90.21:9083/service/sxly_oa_fct_receivecontract +prod.leasrProceedsUrl=http://10.1.90.21:9083/service/sxly_oa_arap_gatherbill +prod.updateleasrUrl=http://10.1.90.21:9083/service/sxly_oa_fct_changecontract +prod.paymentplandetailUrl=http://10.1.90.21:9083/service/sxly_oa_fct_paymentplandetail +prod.leasrTerminationUrl=http://10.1.90.21:9083/service/sxly_oa_fct_terminationcontract +prod.leasrTerminationfkUrl=http://10.1.90.21:9083/service/sxly_oa_fct_terminationfkcontract +prod.leasrDerateUrl=http://10.1.90.21:9083/service/sxly_oa_fct_deratecontracy +prod.fctChangeplandetailUrl=http://10.1.90.21:9083/service/sxly_oa_fct_changeplandetail +prod.htpaybillServletUrl=http://10.1.90.21:9083/service/sxly_oa_arap_htpaybillServlet +prod.receivecontractUrl=http://10.1.90.21:9083/service/sxly_oa_fct_general_receivecontract +prod.paymentcontractUrl=http://10.1.90.21:9083/service/sxly_oa_fct_general_paymentcontract +prod.terminationcontractUrl=http://10.1.90.21:9083/service/sxly_oa_fct_terminationcontract +prod.terminationfkcontractUrl=http://10.1.90.21:9083/service/sxly_oa_fct_terminationfkcontract +prod.paybillServletUrl=http://10.1.90.21:9083/service/sxly_oa_paybillServlet + + +#profile=prod +test.leaseUrl=http://10.1.90.21:9083/service/sxly_oa_fct_receivecontract +test.leasrProceedsUrl=http://10.1.90.21:9083/service/sxly_oa_arap_gatherbill +test.updateleasrUrl=http://10.1.90.21:9083/service/sxly_oa_fct_receivecontract +test.paymentplandetailUrl=http://10.1.90.21:9083/service/sxly_oa_fct_paymentplandetail +test.leasrTerminationUrl=http://10.1.90.21:9083/service/sxly_oa_fct_terminationcontract +test.leasrDerateUrl=http://10.1.90.21:9083/service/sxly_oa_fct_deratecontracy +test.fctChangeplandetailUrl=http://10.1.90.21:9083/service/sxly_oa_fct_changeplandetail \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/JDBCcontract.properties b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/JDBCcontract.properties new file mode 100644 index 0000000..29d66f7 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/JDBCcontract.properties @@ -0,0 +1,16 @@ +profile=prod +#prod.jdbcdriver=oracle.jdbc.driver.OracleDriver +#prod.jdbcurl=jdbc:oracle:thin:@10.1.20.21:1521:orcl +#prod.jdbcuser=bip2oa +#prod.jdbcpassword=sxlybip2022oa +prod.jdbcdriver=oracle.jdbc.driver.OracleDriver +prod.jdbcurl=jdbc:oracle:thin:@10.1.90.21:1521:orcl +prod.jdbcuser=bip2oa +prod.jdbcpassword=sxlybip2022oa + + +#profile=prod +test.jdbcdriber=oracle.jdbc.driver.OracleDriver +test.jdbcurl=jdbc:oracle:thin:@10.1.90.21:1521:orcl +test.jdbcuser=bip2oa +test.jdbcpassword=sxlybip2022oa diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/pluginCfg.xml new file mode 100644 index 0000000..2a83076 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_contract + 合同管理集成 + 20230510 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-dao.xml new file mode 100644 index 0000000..6ec2807 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-dao.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-fieldctrl.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-fieldctrl.xml new file mode 100644 index 0000000..8643eaf --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-fieldctrl.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-node.xml new file mode 100644 index 0000000..6012c95 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_contract/spring/spring-node.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/pluginCfg.xml new file mode 100644 index 0000000..4ecacb0 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_generalmatter + 通用事项审批 + 20231106 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/spring/spring-event.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/spring/spring-event.xml new file mode 100644 index 0000000..0d3d88d --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/spring/spring-event.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/spring/spring-node.xml new file mode 100644 index 0000000..4bd9e7b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_generalmatter/spring/spring-node.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/pa.properties b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/pa.properties new file mode 100644 index 0000000..a22fbdb --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/pa.properties @@ -0,0 +1,25 @@ +jdbc_driver =com.mysql.jdbc.Driver +jdbc_url =jdbc:mysql://127.0.0.1:3306/sxly?&autoReconnect=true&failOverReadOnly=false&useSSL=false +jdbc_user =root +jdbc_password =root123456 +# +# +#jdbc_driverf9 =com.mysql.jdbc.Driver +#jdbc_urlf9 = jdbc:mysql://127.0.0.1:3306/dwzwa?&autoReconnect=true&failOverReadOnly=false&useSSL=false +#jdbc_userf9 = root +#jdbc_passwordf9 = root123456 + + + +#jdbc_driver =com.microsoft.sqlserver.jdbc.SQLServerDriver +#jdbc_url =jdbc:sqlserver://127.0.0.1:1433;databaseName=seeyon; +#jdbc_user =sa +#jdbc_password =Esch@123@rjxt +# +# +#jdbc_driverf9 = com.microsoft.sqlserver.jdbc.SQLServerDriver +#jdbc_urlf9 = jdbc:sqlserver://172.30.41.4:1433;databaseName=dwzwa2024; +#jdbc_userf9 = sa +#jdbc_passwordf9 = Abc123 + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/pluginCfg.xml new file mode 100644 index 0000000..bfd8bed --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_gettaxrate + 获取OA税率参数 + 20241130 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/spring/spring-dao.xml new file mode 100644 index 0000000..bc19efb --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_gettaxrate/spring/spring-dao.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/pluginCfg.xml new file mode 100644 index 0000000..fe3be84 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_handle + 统一代办集成 + 20230307 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/spring/spring-dao.xml new file mode 100644 index 0000000..18e562b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/spring/spring-dao.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/spring/spring-event.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/spring/spring-event.xml new file mode 100644 index 0000000..e584496 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_handle/spring/spring-event.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/pluginCfg.xml new file mode 100644 index 0000000..337d543 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_hxinvoice + 航信开票系统集成管理 + 20241207 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-contriller.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-contriller.xml new file mode 100644 index 0000000..6d82920 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-contriller.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-dao.xml new file mode 100644 index 0000000..6d3c136 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-dao.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-event.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-event.xml new file mode 100644 index 0000000..9a88294 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-event.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-fieldctrl.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-fieldctrl.xml new file mode 100644 index 0000000..bb6a0a8 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-fieldctrl.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-hxinvoice.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-hxinvoice.xml new file mode 100644 index 0000000..837cb99 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-hxinvoice.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-node.xml new file mode 100644 index 0000000..bb10933 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-node.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-quartz.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-quartz.xml new file mode 100644 index 0000000..f12a74b --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-quartz.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-service.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-service.xml new file mode 100644 index 0000000..837c553 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-service.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-sso.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-sso.xml new file mode 100644 index 0000000..64fc923 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_hxinvoice/spring/spring-sso.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/jyncfile.properties b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/jyncfile.properties new file mode 100644 index 0000000..fcb3a7f --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/jyncfile.properties @@ -0,0 +1,35 @@ +profile=prod +prod.paybillFileUrl=http://10.1.10.21:9082/service/sxly_oa_arap_paybillFileToNcc +prod.generalbillUrl=http://10.1.10.21:9082/service/sxly_oa_arap_generalbill +prod.transformUrl=http://10.1.10.21:9082/service/sxly_oa_typaybillServlet +prod.xcfzCancelUrl=http://10.1.10.21:9082/service/sxly_oa_hrreverseprocess +prod.sbfzCancelUrl=http://10.1.10.21:9082/service/sxly_oa_hrbm_reverseProcess +#prod.paybillFileUrl=http://10.1.90.21:9083/service/sxly_oa_arap_paybillFileToNcc +#prod.generalbillUrl=http://10.1.90.21:9083/service/sxly_oa_arap_generalbill +#prod.transformUrl=http://10.1.90.21:9083/service/sxly_oa_typaybillServlet +#prod.xcfzCancelUrl=http://10.1.90.21:9083/service/sxly_oa_hrreverseprocess +#prod.sbfzCancelUrl=http://10.1.90.21:9083/service/sxly_oa_hrbm_reverseProcess +prod.oaTokenUrl=http://127.0.0.1:80/seeyon/rest/token +prod.dowUrl=http://127.0.0.1:80/seeyon/rest/attachment/file + +#prod.jyncFile=http://10.1.10.12:80/seeyon/jyncfile +#prod.restname=testfanwei +#prod.restpassword=6af4b11f-328e-43a2-8280-2a093b088fba +prod.jyncFile=http://10.1.10.13:80/seeyon/jyncfile +prod.restname=testHR +prod.restpassword=5434c7fc-12e6-4d17-97e0-ba1a825757e4 +#prod.oaTokenUrl=http://127.0.0.1:8888/seeyon/rest/token +#prod.dowUrl=http://127.0.0.1:8888/seeyon/rest/attachment/file +#prod.restname=shenxian +#prod.restpassword=ccfa57fe-cf2f-4d26-a24c-a0801a431168 + +#profile=prod +test.paybillFileUrl=http://10.1.90.21:9083/service/sxly_oa_arap_paybillFileToNcc +test.transformUrl=http://10.1.90.21:9082/service/sxly_oa_typaybillServlet +test.tyfzCancelUrl=http://10.1.90.21:9083/service/sxly_oa_hrreverseprocess +test.sbfzCancelUrl=http://10.1.90.21:9083/service/sxly_oa_hrbm_reverseProcess +test.oaTokenUrl=http://127.0.0.1:80/seeyon/rest/token +test.dowUrl=http://127.0.0.1:80/seeyon/rest/attachment/file +test.jyncFile=http://10.1.10.12:80/seeyon/jyncfile +test.restname=testfanwei +test.restpassword=6af4b11f-328e-43a2-8280-2a093b088fba diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/pluginCfg.xml new file mode 100644 index 0000000..26bc812 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_nc_file + 薪酬分账单及附件集成 + 20230616 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/spring/spring-event.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/spring/spring-event.xml new file mode 100644 index 0000000..0cba892 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/spring/spring-event.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/spring/spring-node.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/spring/spring-node.xml new file mode 100644 index 0000000..1e1a263 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_nc_file/spring/spring-node.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/pluginCfg.xml new file mode 100644 index 0000000..e485d50 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_ordinary + 生成合同编号 + 20230525 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/spring/spring-dao.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/spring/spring-dao.xml new file mode 100644 index 0000000..3357ad9 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/spring/spring-dao.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/spring/spring-fieldctrl.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/spring/spring-fieldctrl.xml new file mode 100644 index 0000000..cc06037 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_ordinary/spring/spring-fieldctrl.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/pluginCfg.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/pluginCfg.xml new file mode 100644 index 0000000..8704134 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_powerfeeinvoice + 水电费开票 + 20250211 + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring-manager.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring-manager.xml new file mode 100644 index 0000000..58e7357 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring-manager.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring-quartz.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring-quartz.xml new file mode 100644 index 0000000..955cecc --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring-quartz.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring.xml b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring.xml new file mode 100644 index 0000000..a8892b5 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/cfgHome/plugin/src_powerfeeinvoice/spring/spring.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp b/v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp new file mode 100644 index 0000000..0f620b0 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp @@ -0,0 +1,249 @@ +<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" %> +<%@ page language="java" import=" com.seeyon.apps.m3.skin.enums.M3StartPageCustomEnum" %> + + + + + <%@ include file="/WEB-INF/jsp/common/common.jsp" %> + 模板二维码生成 + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/formQueryBtn.css b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/formQueryBtn.css new file mode 100644 index 0000000..ae96722 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/formQueryBtn.css @@ -0,0 +1,27 @@ +.customButton_class_box { + width: 100%; + line-height: 24px; + height:24px; + color: #1f85ec; + cursor: pointer; + font-family: "Microsoft YaHei"!important; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break:keep-all; +} +.customButton_box_content{ + width: 100%; + height: 24px; + box-sizing: border-box; + -webkit-box-sizing : border-box; + -moz-box-sizing : border-box; + text-align: center; + outline: none; + border: 1px solid #1f85ec; + background-color: #fff; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; +} + diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/img/icon16.png b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/img/icon16.png new file mode 100644 index 0000000..e43def3 Binary files /dev/null and b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/img/icon16.png differ diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/setCondition.css b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/setCondition.css new file mode 100644 index 0000000..6e08db4 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/setCondition.css @@ -0,0 +1,13 @@ +.relation_container .panel_bottom .zidong_guanlian .guanlian_map{ + padding-left: 10px; +} +.relation_container .panel_bottom .zidong_guanlian .guanlian_map .error-title{ + margin: 0 2px; + visibility: hidden; +} +.relation_container .panel_bottom .zidong_guanlian .guanlian_map .error-title.active{ + visibility: visible; +} +.relation_container .biz_groupguanlian .div_sel3.active{ + border-color: red; +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/setTemplate.css b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/setTemplate.css new file mode 100644 index 0000000..a87540a --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/css/setTemplate.css @@ -0,0 +1,87 @@ +body{ + font-family: "microsoft yahei"; +} +#tab { + height: 26px; + width: 100%; + border-bottom: 1px solid #666666; + margin-bottom: 5px; +} +#tab span { + height: 30px; + line-height: 30px; + width: 50%; + font-size: 14px; + text-align: center; + color: #666666; + margin-right: 20px; + padding: 0 5px 0 5px; + cursor: pointer; +} +#tab span.select { + border-bottom: 2px solid #2453b3; + color: #2453b3; +} + +.list{ + list-style: none; + margin: 0; + padding: 0; + font-size: 14px; + height: 310px; + overflow: auto; +} +.list .active{ + background-color: #1F85EC; + border: 1px solid #1F85EC; + color: #ffffff; +} + +.list li{ + cursor: pointer; + margin: 3px 0 3px 0; +} +.list span{ + display: inline-block; + background: url("img/icon16.png") -32px -240px no-repeat scroll transparent; + margin-right: 2px; + vertical-align: middle; + width: 16px; + height: 16px; +} +.search-box { + height: 20px; + margin: 10px 0 10px 0; + position: relative; +} +.cap-icon-sousuo { + position: absolute; + top: 2px; + left: 170px; + color: #1F85EC; + font-size: 20px; + line-height: 20px; + cursor: pointer; +} +.cap-icon-sousuo:before { + content: ""; + background: url("img/icon16.png") -192px -176px no-repeat; + height: 16px; + line-height: 16px; + width: 16px; + font-size: 12px; + display: block; + position: absolute; + top: 5px; + margin-left: 2px; +} +.search-input { + background: #FFFFFF; + border: 1px solid #D4D4D4; + border-radius: 100px; + min-height: 20px; + width: 150px; + padding-right: 35px; + padding-left: 10px; + outline: none; +} diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/html/setTemplate.html b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/html/setTemplate.html new file mode 100644 index 0000000..edb3554 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/html/setTemplate.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+ 选择底表 +
+ +
+ +
    +
    + + + \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/LodopFuncs.js b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/LodopFuncs.js new file mode 100644 index 0000000..9bf5413 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/LodopFuncs.js @@ -0,0 +1,188 @@ +//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序== + +//用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占: +var MainJS ="CLodopfuncs.js", + URL_WS1 = "ws://localhost:8000/"+MainJS, //ws用8000/18000 + URL_WS2 = "ws://localhost:18000/"+MainJS, + URL_HTTP1 = "http://localhost:8000/"+MainJS, //http用8000/18000 + URL_HTTP2 = "http://localhost:18000/"+MainJS, + URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS; //https用8000/8443 + +var CreatedOKLodopObject, CLodopIsLocal, LoadJsState; + +//==判断是否需要CLodop(那些不支持插件的浏览器):== +function needCLodop() { + try { + var ua = navigator.userAgent; + if (ua.match(/Windows\sPhone/i) || + ua.match(/iPhone|iPod|iPad/i) || + ua.match(/Android/i) || + ua.match(/Edge\D?\d+/i)) + return true; + var verTrident = ua.match(/Trident\D?\d+/i); + var verIE = ua.match(/MSIE\D?\d+/i); + var verOPR = ua.match(/OPR\D?\d+/i); + var verFF = ua.match(/Firefox\D?\d+/i); + var x64 = ua.match(/x64/i); + if ((!verTrident) && (!verIE) && (x64)) return true; + else if (verFF) { + verFF = verFF[0].match(/\d+/); + if ((verFF[0] >= 41) || (x64)) return true; + } else if (verOPR) { + verOPR = verOPR[0].match(/\d+/); + if (verOPR[0] >= 32) return true; + } else if ((!verTrident) && (!verIE)) { + var verChrome = ua.match(/Chrome\D?\d+/i); + if (verChrome) { + verChrome = verChrome[0].match(/\d+/); + if (verChrome[0] >= 41) return true; + } + } + return false; + } catch (err) { + return true; + } +} + +//==检查加载成功与否,如没成功则用http(s)再试== +//==低版本CLODOP6.561/Lodop7.043及前)用本方法== +function checkOrTryHttp() { + if (window.getCLodop) { + LoadJsState = "complete"; + return true; + } + if (LoadJsState == "loadingB" || LoadJsState == "complete") return; + LoadJsState = "loadingB"; + var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement; + var JS1 = document.createElement("script") + ,JS2 = document.createElement("script") + ,JS3 = document.createElement("script"); + JS1.src = URL_HTTP1; + JS2.src = URL_HTTP2; + JS3.src = URL_HTTP3; + JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";} + JS1.onerror = function(e) { + if (window.location.protocol !== 'https:') + head.insertBefore(JS2, head.firstChild); else + head.insertBefore(JS3, head.firstChild); + } + head.insertBefore(JS1,head.firstChild); +} + +//==加载Lodop对象的主过程:== +(function loadCLodop(){ + if (!needCLodop()) return; + CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i)); + LoadJsState = "loadingA"; + if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket; + //ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新: + try { + var WSK1=new WebSocket(URL_WS1); + WSK1.onopen = function(e) { setTimeout("checkOrTryHttp();",200); } + WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);} + WSK1.onerror = function(e) { + var WSK2=new WebSocket(URL_WS2); + WSK2.onopen = function(e) {setTimeout("checkOrTryHttp();",200);} + WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);} + WSK2.onerror= function(e) {checkOrTryHttp();} + } + } catch(e){ + checkOrTryHttp(); + } +})(); + +//==获取LODOP对象主过程,判断是否安装、需否升级:== +function getLodop(oOBJECT, oEMBED) { + var strFontTag = "
    打印控件"; + var strLodopInstall = strFontTag + "未安装!点击这里执行安装"; + var strLodopUpdate = strFontTag + "需要升级!点击这里执行升级"; + var strLodop64Install = strFontTag + "未安装!点击这里执行安装"; + var strLodop64Update = strFontTag + "需要升级!点击这里执行升级"; + var strCLodopInstallA = "
    Web打印服务CLodop未安装启动,点击这里下载执行安装"; + var strCLodopInstallB = "
    (若此前已安装过,可点这里直接再次启动)"; + var strCLodopUpdate = "
    Web打印服务CLodop需升级!点击这里执行升级"; + var strLodop7FontTag = "
    Web打印服务Lodop7"; + var strLodop7HrefX86 = "点击这里下载安装(下载后解压,点击lodop文件开始执行)"; + var strLodop7HrefARM = "点击这里下载安装(下载后解压,点击lodop文件开始执行)"; + var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86; + var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM; + var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86; + var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM; + var strInstallOK = ",成功后请刷新本页面或重启浏览器。"; + var LODOP; + try { + var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent)); + var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent)); + var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform)); + var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform)); + + if (needCLodop() || isLinuxX86 || isLinuxARM) { + try { + LODOP = window.getCLodop(); + } catch (err) {} + if (!LODOP && LoadJsState !== "complete") { + if (!LoadJsState) + alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); else + alert("网页还没下载完毕,请稍等一下再操作."); + return; + } + var strAlertMessage; + if (!LODOP) { + if (isLinuxX86) + strAlertMessage = strLodop7Install_X86; + else if (isLinuxARM) + strAlertMessage = strLodop7Install_ARM; + else + strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : ""); + document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML; + return; + } else { + if (isLinuxX86 && LODOP.CVERSION < "7.0.4.3") + strAlertMessage = strLodop7Update_X86; + else if (isLinuxARM && LODOP.CVERSION < "7.0.4.3") + strAlertMessage = strLodop7Update_ARM; + else if (CLODOP.CVERSION < "6.5.7.1") + strAlertMessage = strCLodopUpdate; + + if (strAlertMessage) + document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML; + } + } else { + //==如果页面有Lodop插件就直接使用,否则新建:== + if (oOBJECT || oEMBED) { + if (isWinIE) + LODOP = oOBJECT; + else + LODOP = oEMBED; + } else if (!CreatedOKLodopObject) { + LODOP = document.createElement("object"); + LODOP.setAttribute("width", 0); + LODOP.setAttribute("height", 0); + LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;"); + if (isWinIE) + LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA"); + else + LODOP.setAttribute("type", "application/x-print-lodop"); + document.documentElement.appendChild(LODOP); + CreatedOKLodopObject = LODOP; + } else + LODOP = CreatedOKLodopObject; + //==Lodop插件未安装时提示下载地址:== + if ((!LODOP) || (!LODOP.VERSION)) { + document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML; + return LODOP; + } + if (LODOP.VERSION < "6.2.2.6") { + document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML; + } + } + //===如下空白位置适合调用统一功能(如注册语句、语言选择等):======================= + + + //=============================================================================== + return LODOP; + } catch (err) { + alert("getLodop出错:" + err); + } +} + diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflow.js b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflow.js new file mode 100644 index 0000000..ee9b5f6 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflow.js @@ -0,0 +1,150 @@ +(function(f){ + var nameSpace = 'field_6903530450190094319'; + if(!window[nameSpace]){ + var Builder = f(); + window[nameSpace] = { + instance: {} + }; + window[nameSpace].init = function (options) { + window[nameSpace].instance[options.privateId] = new Builder(options); + }; + } +})(function(){ + /** + * 构造函数 + * @param options + * @constructor + */ + function App(options) { + var self = this; + //初始化参数 + self.initParams(options); + //初始化dom + self.initDom(); + //事件 + self.events(); + } + + App.prototype = { + initParams : function (options) { + var self = this; + self.adaptation = options.adaptation; + self.adaptation.formMessage = options.formMessage; + self.privateId = options.privateId; + self.messageObj = options.getData; + self.preUrl = options.url_prefix; + }, + initDom : function () { + var self = this; + dynamicLoading.css(self.preUrl + 'css/formQueryBtn.css'); + self.appendChildDom(); + }, + events : function () { + var self = this; + // 监听是否数据刷新 + + $(".field0313__").css("background-color","#008BFF"); + $(".field0313__").css("color","#FFFFFF"); + $(".field0313__").css("border-radius","10px"); + $(".field0313__").mouseover(function (e) { + var $this = $(this);// 当前触发事件的标签对象 + }).mouseout(function (e) { + $(".field0313__").css("background-color","#008BFF"); + }).mousemove(function (e) { + $(".field0313__").css("background-color","#005297"); + }); + + }, + appendChildDom : function () { + var self = this; + var domStructure = '
    '+ + '
    '+ self.messageObj.display.escapeHTML() +'
    '+ + '
    '; + document.querySelector('#' + self.privateId).innerHTML = domStructure; + var jumpFun = function() { + var formmain_3757 = self.adaptation.formdata.field0313__.formmains.formmain_3757; + var field0249 = formmain_3757.field0249.value; + var field0108 = formmain_3757.field0108.value; + var field0115 = formmain_3757.field0115.value; + var field0312 = formmain_3757.field0312.value; + if(field0312.includes("推送BIP成功")){ + alert("当前合同已成功推送BIP系统,禁止重复生成合同编号"); + return; + } + var result = true; + if(field0249 !=''){ + result = confirm('当前合同已经存在合同编号是否选择变更!'); + } + if(field0108==''){ + alert("合同主体编号为空,填写合同主体编号"); + return ; + } + var url2 = window.location.origin; + var s = self; + var str = ""; + console.log(s); + if(result){ + $.ajax({ + //请求url + url: url2+'/seeyon/servlet/ordinaryCodeServlet', + contentType:"application/json", + //请求参数 + data: {"unitCode":field0108,"oanum":field0115}, + //请求类型 + type: 'POST', + //响应体结果设置 + dataType: 'json', + //成功的回调函数 + success: function(data){ + if("200"==data.isSucceed){ + self.adaptation.formdata.field0313__.formmains.formmain_3757.field0249.value = data.newCode; + }else if ("500"==data.isSucceed){ + alert(data.msg); + }else{ + alert("生成失败,请联系管理员"); + } + }, + //失败的回调函数 + error: function(){ + top.$.alert("生成失败,请联系管理员"); + } + }); + } + var content = self.messageObj.formdata.content; + + }; + document.querySelector('.' + self.privateId).removeEventListener('click', jumpFun); + document.querySelector('.' + self.privateId).addEventListener('click', jumpFun); + //渲染隐藏权限 + if (self.messageObj.auth === 'hide') { + document.querySelector('#' + self.privateId).innerHTML = '
    ***
    '; + } + } + }; + + var dynamicLoading = { + css: function(path) { + if(!path || path.length === 0) { + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var link = document.createElement('link'); + link.href = path; + link.rel = 'stylesheet'; + link.type = 'text/css'; + head.appendChild(link); + }, + js: function(path) { + if(!path || path.length === 0) { + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.src = path; + script.type = 'text/javascript'; + head.appendChild(script); + } + } + + return App; +}); \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflow.js.bak b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflow.js.bak new file mode 100644 index 0000000..4720e83 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflow.js.bak @@ -0,0 +1,134 @@ +(function(f){ + var nameSpace = 'field_6903530450190094319'; + if(!window[nameSpace]){ + var Builder = f(); + window[nameSpace] = { + instance: {} + }; + window[nameSpace].init = function (options) { + window[nameSpace].instance[options.privateId] = new Builder(options); + }; + } +})(function(){ + /** + * 构造函数 + * @param options + * @constructor + */ + function App(options) { + var self = this; + //初始化参数 + self.initParams(options); + //初始化dom + self.initDom(); + //事件 + self.events(); + } + + App.prototype = { + initParams : function (options) { + var self = this; + self.adaptation = options.adaptation; + self.adaptation.formMessage = options.formMessage; + self.privateId = options.privateId; + self.messageObj = options.getData; + self.preUrl = options.url_prefix; + }, + initDom : function () { + var self = this; + dynamicLoading.css(self.preUrl + 'css/formQueryBtn.css'); + self.appendChildDom(); + }, + events : function () { + var self = this; + // 监听是否数据刷新 + }, + appendChildDom : function () { + var self = this; + var domStructure = '
    '+ + '
    '+ self.messageObj.display.escapeHTML() +'
    '+ + '
    '; + document.querySelector('#' + self.privateId).innerHTML = domStructure; + var jumpFun = function() { + var formmain_3717 = self.adaptation.formdata.field0290__.formmains.formmain_3717; + var field0249 = formmain_3717.field0249.value; + var field0108 = formmain_3717.field0108.value; + var field0115 = formmain_3717.field0115.value; + var result = true; + if(field0249 !=''){ + result = confirm('当前合同已经存在合同编号是否选择变更!'); + } + if(field0108==''){ + alert("合同主体编号为空,填写合同主体编号"); + return ; + } + var url2 = window.location.origin; + var s = self; + var str = ""; + console.log(s); + if(result){ + $.ajax({ + //请求url + url: url2+'/seeyon/servlet/ordinaryCodeServlet', + contentType:"application/json", + //url: 'http://8.142.7.132/seeyon/servlet/deliveryServlet?dataid='+dataId, + //请求参数 + data: {"unitCode":field0108,"oanum":field0115}, + //请求类型 + type: 'POST', + //响应体结果设置 + dataType: 'json', + //成功的回调函数 + success: function(data){ + if("200"==data.isSucceed){ + self.adaptation.formdata.field0290__.formmains.formmain_3717.field0249.value = data.newCode; + }else if ("500"==data.isSucceed){ + alert(data.msg); + }{ + alert("生成失败"); + } + }, + //失败的回调函数 + error: function(){ + top.$.alert("失败的回调"); + } + }); + } + var content = self.messageObj.formdata.content; + + }; + document.querySelector('.' + self.privateId).removeEventListener('click', jumpFun); + document.querySelector('.' + self.privateId).addEventListener('click', jumpFun); + //渲染隐藏权限 + if (self.messageObj.auth === 'hide') { + document.querySelector('#' + self.privateId).innerHTML = '
    ***
    '; + } + } + }; + + var dynamicLoading = { + css: function(path) { + if(!path || path.length === 0) { + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var link = document.createElement('link'); + link.href = path; + link.rel = 'stylesheet'; + link.type = 'text/css'; + head.appendChild(link); + }, + js: function(path) { + if(!path || path.length === 0) { + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.src = path; + script.type = 'text/javascript'; + head.appendChild(script); + } + } + + return App; +}); \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflowm3.js b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflowm3.js new file mode 100644 index 0000000..a01b5ab --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/openUnflowm3.js @@ -0,0 +1,88 @@ +(function () { + // >>> step1. 定义控件唯一标识(命名空间) + var scopeName = "field_6903530450190094319"; + + // >>> step2. 实现自定义控件渲染及交互逻辑 + var MyWidgetImpl = function (options) { + this.customWidgetType = scopeName; + this._create(options); + }; + MyWidgetImpl.prototype = { + constructor: MyWidgetImpl, + _create: function (options) { + this._options = options; + this._widgetId = options.privateId; + this._widgetProxy = options.adaptation; + this._wrapper = document.getElementById(this._widgetId); + this._field = this._widgetProxy.childrenGetData(this._widgetId); + this._tunnelId = 'Event' + this._widgetId; + if (!this._wrapper) return console.warn('没有找到组件渲染的容器'); + this.clicked = 0; + this._update(); + console.log(this._widgetProxy); + }, + _update: function (field) { + if (field) this._field = field; + this._destroy(); + this._buildRendering(); + this._postCreate(); + }, + _buildRendering: function () { + var elemId = 'section-' + this._widgetId; + var btnId = 'section-' + this._widgetId + '-btn'; + var tpl = '
    ' + + '' + + '
    '; + this._wrapper.innerHTML = tpl; + this._el = this._wrapper.querySelector('#' + elemId); + this._btnEl = this._wrapper.querySelector('#' + btnId); + }, + _postCreate: function () { + this._unbindTap = this._bind(this._btnEl, 'tap', this.onClick.bind(this)); + this._unbindUpdate = this._listen(this._tunnelId, this._update.bind(this)); + }, + _destroy: function () { + this._unbindTap && this._unbindTap(); + this._unbindUpdate && this._unbindUpdate(); + this._el = this._btnEl = null; + }, + _bind: function (el, evt, cb) { + el.addEventListener(evt, cb, false); + return function () { + el.removeEventListener(evt, cb, false); + } + }, + _listen: function(evt, cb) { + var hub = this._widgetProxy.ObserverEvent; + hub.listen(evt, cb); + return function() { + hub.remove(evt, cb); + } + }, + onClick: function () { + this.clicked += 1; + this._btnEl.innerHTML = this._field.display + + 'clicked ' + this.clicked + '次'; + alert('Hello CAP4!'); + this._update(); + } + }; + + // >>> step3. 实现开发规范约定的init及destroy接口 + var myWidgets = {}; + // 组件初始化 + MyWidgetImpl.init = function (options) { + var widget = new MyWidgetImpl(options); + myWidgets[ widget._widgetId ] = widget; + }; + // 组件销毁 + MyWidgetImpl.destroy = function (widgetId) { + var widget = myWidgets[ widgetId ]; + if (widget) widget._destroy(); + delete myWidgets[ widgetId ]; + }; + + // >>> step4. 注册组件实现到命名控件 + window[ scopeName ] = MyWidgetImpl; +})(); \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/setTemplate.js b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/setTemplate.js new file mode 100644 index 0000000..bc6bb40 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/apps_res/cap/customCtrlResources/ordinaryResources/js/setTemplate.js @@ -0,0 +1,99 @@ +var unflowList, param, loading, process; +$(document).ready(function() { + param = initParam().params;// 获取页面参数 + // 处理进度条 + process = top.$.progressBar({ + text : "加载中..." + }); + loading = true; + getUnflowList(); +}); + + +// 获取底表 +function getUnflowList() { + $.ajax({ + url : "/seeyon/rest/cap4/unflow/select", + async : true, + success : function(data) { + // 处理进度条 + if (loading) + process.close(); + loading = false; + //data = JSON.parse(data); + var result = data.data; + unflowList = result; + for (var i = 0; i < result.length; i++) { + $("#queryList ul").append( + $("
  • " + + result[i].name + + "
  • ").attr("info", + JSON.stringify(result[i]))); + } + $("#queryList ul").delegate( + "li", + "click", + function() { + $(this).siblings().removeClass('active').end() + .addClass('active'); + }); + if (param && param.id) { // 激活当前项 + $('#' + param.id).trigger('click'); + } + } + }); +} + +// 搜索 +function search() { + var searchValue = $("#search_query").val(); + $("#queryList ul").empty(); + for (var i = 0; i < unflowList.length; i++) { + if (unflowList[i].name.indexOf(searchValue) != -1) { + $("#queryList ul").append( + $("
  • " + + unflowList[i].name + "
  • ").attr( + "info", JSON.stringify(unflowList[i]))); + } + } +} + +// 返回参数获取 +function getResult() { + return JSON.parse($("#queryList ul").find(".active").attr("info") + || "{}"); +} + +// --------------------以下为固定方法,需要实现返回参数获取-------------- + +// 获取弹窗传递过来的参数 +function initParam() { + var obj = window.parentDialogObj && (window.parentDialogObj["ctrlDialog"]);// 获取窗口对象 + if (obj && obj.getTransParams) { + // 然后通过V5方法获取弹窗传递过来的参数 + return obj.getTransParams(); + } +} + +// 确定按钮调用方法,返回需要的json数据 +function OK() { + var result = getResult(); + + if (param && param.designId !== result.designId) + return { + valid : true, + data : { + customParam : { + templateId : result, + mapping : null + } + } + }; + + return { + valid : true, + data : result + }; +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js b/v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js new file mode 100644 index 0000000..ec27f89 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/common/capextend/cap4/form/utils/qrcodeform/index.js @@ -0,0 +1,13 @@ + +csdk.event.on('formRendered', function(){ + + try { + if(cmp.href.getParam().qc = "ext") { + document.getElementById("relationBtns").style.display="none"; + document.getElementById("attachment_wrap").style.display="none"; + } + } catch(e) { + + } + +}); diff --git a/v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js b/v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js new file mode 100644 index 0000000..bc09362 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js @@ -0,0 +1,11 @@ +document.addEventListener('cap_form_afterFormRender', function(evt) { + try { + if(cmp.href.getParam().qc == "ext") { + document.getElementById("relationBtns").style.display="none"; + document.getElementById("attachment_wrap").style.display="none"; + document.getElementsByClassName("cmp-button-left-iconContent btn-box2")[0].style.display="none"; + } + } catch(e) { + + } +}); \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/formQueryBtn.css b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/formQueryBtn.css new file mode 100644 index 0000000..ae96722 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/formQueryBtn.css @@ -0,0 +1,27 @@ +.customButton_class_box { + width: 100%; + line-height: 24px; + height:24px; + color: #1f85ec; + cursor: pointer; + font-family: "Microsoft YaHei"!important; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break:keep-all; +} +.customButton_box_content{ + width: 100%; + height: 24px; + box-sizing: border-box; + -webkit-box-sizing : border-box; + -moz-box-sizing : border-box; + text-align: center; + outline: none; + border: 1px solid #1f85ec; + background-color: #fff; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; +} + diff --git a/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/img/icon16.png b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/img/icon16.png new file mode 100644 index 0000000..e43def3 Binary files /dev/null and b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/img/icon16.png differ diff --git a/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/setCondition.css b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/setCondition.css new file mode 100644 index 0000000..6e08db4 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/css/setCondition.css @@ -0,0 +1,13 @@ +.relation_container .panel_bottom .zidong_guanlian .guanlian_map{ + padding-left: 10px; +} +.relation_container .panel_bottom .zidong_guanlian .guanlian_map .error-title{ + margin: 0 2px; + visibility: hidden; +} +.relation_container .panel_bottom .zidong_guanlian .guanlian_map .error-title.active{ + visibility: visible; +} +.relation_container .biz_groupguanlian .div_sel3.active{ + border-color: red; +} \ No newline at end of file diff --git a/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/js/ordinary.js b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/js/ordinary.js new file mode 100644 index 0000000..e39b2e6 --- /dev/null +++ b/v5/apps-customize/src/main/webapp/m3/apps/v5/ordinary/js/ordinary.js @@ -0,0 +1,180 @@ +(function () { + var scopeName = "field_6903530450190094319"; + + var ContractNoImpl = function (options) { + this.customWidgetType = scopeName; + this._create(options); + }; + + ContractNoImpl.prototype = { + constructor: ContractNoImpl, + + _create: function (options) { + this._options = options; + this._widgetId = options.privateId; + this._widgetProxy = options.adaptation; + this._wrapper = document.getElementById(this._widgetId); + this._field = this._widgetProxy.childrenGetData(this._widgetId); + this._tunnelId = 'Event' + this._widgetId; + + if (!this._wrapper) return console.warn('没有找到组件渲染的容器'); + + this.clicked = 0; + this._update(); + }, + + _update: function (field) { + if (field) this._field = field; + this._destroy(); + this._buildRendering(); + this._postCreate(); + }, + + _buildRendering: function () { + var elemId = 'section-' + this._widgetId; + var btnId = 'section-' + this._widgetId + '-btn'; + var tpl = '
    ' + + '' + + '
    '; + + this._wrapper.innerHTML = tpl; + this._el = this._wrapper.querySelector('#' + elemId); + this._btnEl = this._wrapper.querySelector('#' + btnId); + }, + + _postCreate: function () { + this._fieldElement = this._wrapper.querySelector('.field0313__'); + + if (this._fieldElement) { + this._unbindTouchStart = this._bind(this._fieldElement, 'touchstart', this.onTouchStart.bind(this)); + this._unbindTouchEnd = this._bind(this._fieldElement, 'touchend', this.onTouchEnd.bind(this)); + this._unbindTouchMove = this._bind(this._fieldElement, 'touchmove', this.onTouchMove.bind(this)); + } + + this._unbindTap = this._bind(this._btnEl, 'click', this.onClick.bind(this)); // 改为 click + this._unbindUpdate = this._listen(this._tunnelId, this._update.bind(this)); + }, + + _destroy: function () { + if (this._fieldElement) { + this._unbindTouchStart && this._unbindTouchStart(); + this._unbindTouchEnd && this._unbindTouchEnd(); + this._unbindTouchMove && this._unbindTouchMove(); + } + this._unbindTap && this._unbindTap(); + this._unbindUpdate && this._unbindUpdate(); + this._el = this._btnEl = this._fieldElement = null; + }, + + _bind: function (el, evt, cb) { + el.addEventListener(evt, cb, false); + return function () { + el.removeEventListener(evt, cb, false); + }; + }, + + _listen: function (evt, cb) { + var hub = this._widgetProxy.ObserverEvent; + hub.listen(evt, cb); + return function () { + hub.remove(evt, cb); + }; + }, + + onTouchStart: function () { + if (this._fieldElement) { + this._fieldElement.style.backgroundColor = "#005297"; + } + }, + + onTouchEnd: function () { + if (this._fieldElement) { + this._fieldElement.style.backgroundColor = "#008BFF"; + } + }, + + onTouchMove: function () { + if (this._fieldElement) { + this._fieldElement.style.backgroundColor = "#005297"; + } + }, + + onClick: function () { + var tableName = this._options.formMessage.tableName; + var formmains = this._options.getData.formdata.formmains[tableName]; + var tableMap = formmains.elements; + var contractNo = '', ncCorpCode = '', djNo = '', bipResult = ''; + const keys = Object.keys(tableMap); + + keys.forEach((k) => { + let display = tableMap[k].display; + let value = tableMap[k].value; + if (display === '自动生成合同编号') contractNo = value; + if (display === 'NC公司编码') ncCorpCode = value; + if (display === '单据编号') djNo = value; + if (display === 'BIP返回结果') bipResult = value; + }); + + if (bipResult.includes("推送BIP成功")) { + alert("当前合同已成功推送BIP系统,禁止重复生成合同编号"); + return; + } + + var proceed = true; + if (contractNo !== '') { + proceed = confirm('当前合同已经存在合同编号是否选择变更!'); + } + + if (ncCorpCode === '') { + alert("合同主体编号为空,填写合同主体编号"); + return; + } + + if (proceed) { + const url = `${window.location.origin}/seeyon/servlet/ordinaryCodeServlet`; + const params = new URLSearchParams({ + unitCode: ncCorpCode, + oanum: djNo + }); + + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: params.toString() + }) + .then(response => response.json()) + .then(data => { + if (data.isSucceed === "200") { + formmains.elements["field0249"].value = data.newCode; // 请确认 field0249 是你实际的字段key + } else if (data.isSucceed === "500") { + alert(data.msg); + } else { + alert("生成失败,请联系管理员"); + } + }) + .catch(() => { + alert("生成失败,请联系管理员"); + }); + } + + this._update(); + } + }; + + var myWidgets = {}; + + ContractNoImpl.init = function (options) { + var widget = new ContractNoImpl(options); + myWidgets[widget._widgetId] = widget; + }; + + ContractNoImpl.destroy = function (widgetId) { + var widget = myWidgets[widgetId]; + if (widget) widget._destroy(); + delete myWidgets[widgetId]; + }; + + window[scopeName] = ContractNoImpl; +})();