diff --git a/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java b/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java new file mode 100644 index 0000000..7e73273 --- /dev/null +++ b/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java @@ -0,0 +1,98 @@ +package cn.palmte.work.controller.backend; + +import cn.palmte.work.bean.ResponseMsg; +import cn.palmte.work.service.MonthlySettleService; +import cn.palmte.work.utils.Utils; +import cn.palmte.work.utils.excel.ExcelLogs; +import cn.palmte.work.utils.excel.ExcelUtil; +import cn.palmte.work.utils.excel.ExportUtils; +import com.alibaba.fastjson.JSON; +import org.apache.poi.EncryptedDocumentException; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.poifs.filesystem.OfficeXmlFileException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +@Controller +@RequestMapping("/monthlySettle") +public class MonthlySettleController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(MonthlySettleController.class); + + @Autowired + private MonthlySettleService monthlySettleService; + + @RequestMapping("/list") + public String list(@RequestParam(value = KEYWORDS, required = false) String keywords, + @RequestParam(value = PAGE_NUMBER, defaultValue = DEFAULT_PAGE_NUMBER) int pageNumber, + @RequestParam(value = PAGE_SIZE, defaultValue = DEFAULT_PAGE_SIZE) int pageSize, + Map model) { + // 初始化参数 + setModel(keywords, model); + ConcurrentHashMap searchInfo = getSearchInfo(keywords, model); + model.put("pager", monthlySettleService.list(searchInfo, pageNumber, pageSize)); + return "/admin/account_list"; + } + + private void setModel(@RequestParam(value = "keywords", required = false) String keywords, Map model) { + model.put("keywords", keywords); + } + + @RequestMapping("/export") + public void export(@RequestParam(value = "keywords", required = false) String keywords, HttpServletResponse httpServletResponse) throws IOException { + Map searchInfo = getSearchInfo(keywords); + downloadHeader(httpServletResponse, Utils.generateExcelName("人员信息"), "application/octet-stream"); + String[] headers = {"工号", "手机号码", "姓名", "常驻地", "一级部门", "直接主管", "职位", "角色名称", "公司邮件地址"}; + String[] exportColumns = {"userName", "telephone", "realName", "workLocation", "deptName", "directManager", "positionName", "roleName", "companyEmail"}; + ExportUtils.exportToExcel(headers, exportColumns, 1, 10000, + httpServletResponse.getOutputStream(), (pN, pS) -> monthlySettleService.list(searchInfo, pN, pS).getList()); + } + + /** + * 模板下载 + */ + @RequestMapping("/template") + public void template(HttpServletResponse response) throws Exception { + + String[] headers = new String[]{"项目编号", "最终业主", "合同方", "项目名称", "合同金额", "累计已收款", "已采购累计付款", "已采购累计未付款", "超期垫资金额", "销售累计开票金额", "合同编号", "项目类型", "合同签订时间", "销售经理", "项目经理", "收款节点", "收款要求时间", "收款金额", + "实际收款时间", "实际收款金额", "实际欠收金额", "超期天数", "到货证明", "验收报告时间", "项目风险预警", "已计收金额", "未计收金额"}; + downloadHeader(response, Utils.generateExcelName("月度结算表导入模板")); + ExportUtils exportUtils = new ExportUtils(headers); + exportUtils.write(response.getOutputStream()); + } + + /** + * 批量导入 + */ + @RequestMapping("/batchImport") + @ResponseBody + public String batchImport(MultipartFile file) { + try { + ExcelLogs logs = new ExcelLogs(); + Collection maps = ExcelUtil.importExcel(Map.class, file.getInputStream(), + "yyyy/MM/dd HH:mm:ss", logs, 0); + synchronized (this) { + return JSON.toJSONString(monthlySettleService.check(maps)); + } + } catch (OfficeXmlFileException | EncryptedDocumentException | InvalidFormatException e) { + return JSON.toJSONString(ResponseMsg.buildFailedMsg("格式错误,请上传excel 2003/2007格式文件")); + } catch (Exception e) { + return JSON.toJSONString(ResponseMsg.buildFailedMsg("导入数据失败,请联系管理员")); + } + } +} diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java index 066a1c6..12d3f2e 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -80,6 +80,8 @@ public class ProjectController extends BaseController { private ProjectSettleIncomeRepository projectSettleIncomeRepository; @Autowired private ProjectRepository projectRepository; + @Autowired + private NumSeqService numSeqService; /** * 项目列表 @@ -204,6 +206,8 @@ public class ProjectController extends BaseController { @RequestMapping("/add") public String add(Map model) { Dept one = deptService.findUserDept(InterfaceUtil.getAdmin()); + String projectNo = numSeqService.generate(); + model.put("projectNo", projectNo); model.put("dept", one); model.put("projectId",-1); return "admin/project_estimate_add"; diff --git a/src/main/java/cn/palmte/work/model/MonthlySettle.java b/src/main/java/cn/palmte/work/model/MonthlySettle.java new file mode 100644 index 0000000..90568a0 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/MonthlySettle.java @@ -0,0 +1,377 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +@Entity +@Table(name = "monthly_settle") +public class MonthlySettle { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private int id; + /** + * 项目编号 + */ + @Column(name = "project_no") + private String projectNo; + /** + * 最终业主 + */ + private String owner; + /** + * 合同方 + */ + @Column(name = "contract_party") + private String contractParty; + /** + * 项目名称 + */ + @Column(name = "project_name") + private String projectName; + /** + * 合同金额 + */ + @Column(name = "contract_amount") + private String contractAmount; + /** + * 累计已收款 + */ + @Column(name = "total_collect") + private String totalCollect; + /** + * 已采购累计付款 + */ + @Column(name = "total_purchased_paid") + private String totalPurchasedPaid; + /** + * 已采购累计未付款 + */ + @Column(name = "total_purchased_unpaid") + private String totalPurchasedUnpaid; + /** + * 超期垫资金额 + */ + @Column(name = "time_out_amount") + private String timeOutAmount; + /** + * 销售累计开票金额 + */ + @Column(name = "total_bill_amount") + private String totalBillAmount; + /** + * 合同编号 + */ + @Column(name = "contract_no") + private String contractNo; + /** + * 项目类型 + */ + @Column(name = "project_type") + private String projectType; + /** + * 合同签订时间 + */ + @Column(name = "contract_sign_time") + private String contractSignTime; + /** + * 销售经理 + */ + @Column(name = "sale_manager") + private String saleManager; + /** + * 项目经理 + */ + @Column(name = "project_manager") + private String projectManager; + /** + * 收款节点 + */ + @Column(name = "collect_point") + private String collectPoint; + /** + * 收款要求时间 + */ + @Column(name = "collect_required_time") + private String collectRequiredTime; + /** + * 收款金额 + */ + @Column(name = "collect_amount") + private String collectAmount; + /** + * 实际收款时间 + */ + @Column(name = "collect_actual_time") + private String collectActualTime; + /** + * 实际收款金额 + */ + @Column(name = "collect_actual_amount") + private String collectActualAmount; + /** + * 实际欠收金额 + */ + @Column(name = "uncollect_actual_amount") + private String uncollectActualAmount; + /** + * 超期天数 + */ + @Column(name = "time_out_day") + private String timeOutDay; + /** + * 到货证明 + */ + @Column(name = "product_certificate") + private String productCertificate; + /** + * 验收报告时间 + */ + @Column(name = "inspection_report_time") + private String inspectionReportTime; + /** + * 项目风险预警 + */ + @Column(name = "risk_warning") + private String riskWarning; + /** + * 已计收金额 + */ + @Column(name = "cal_col_amount") + private String calColAmount; + /** + * 未计收金额 + */ + @Column(name = "uncal_col_amount") + private String uncalColAmount; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getProjectNo() { + return projectNo; + } + + public void setProjectNo(String projectNo) { + this.projectNo = projectNo; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getContractParty() { + return contractParty; + } + + public void setContractParty(String contractParty) { + this.contractParty = contractParty; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getContractAmount() { + return contractAmount; + } + + public void setContractAmount(String contractAmount) { + this.contractAmount = contractAmount; + } + + public String getTotalCollect() { + return totalCollect; + } + + public void setTotalCollect(String totalCollect) { + this.totalCollect = totalCollect; + } + + public String getTotalPurchasedPaid() { + return totalPurchasedPaid; + } + + public void setTotalPurchasedPaid(String totalPurchasedPaid) { + this.totalPurchasedPaid = totalPurchasedPaid; + } + + public String getTotalPurchasedUnpaid() { + return totalPurchasedUnpaid; + } + + public void setTotalPurchasedUnpaid(String totalPurchasedUnpaid) { + this.totalPurchasedUnpaid = totalPurchasedUnpaid; + } + + public String getTimeOutAmount() { + return timeOutAmount; + } + + public void setTimeOutAmount(String timeOutAmount) { + this.timeOutAmount = timeOutAmount; + } + + public String getTotalBillAmount() { + return totalBillAmount; + } + + public void setTotalBillAmount(String totalBillAmount) { + this.totalBillAmount = totalBillAmount; + } + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public String getProjectType() { + return projectType; + } + + public void setProjectType(String projectType) { + this.projectType = projectType; + } + + public String getContractSignTime() { + return contractSignTime; + } + + public void setContractSignTime(String contractSignTime) { + this.contractSignTime = contractSignTime; + } + + public String getSaleManager() { + return saleManager; + } + + public void setSaleManager(String saleManager) { + this.saleManager = saleManager; + } + + public String getProjectManager() { + return projectManager; + } + + public void setProjectManager(String projectManager) { + this.projectManager = projectManager; + } + + public String getCollectPoint() { + return collectPoint; + } + + public void setCollectPoint(String collectPoint) { + this.collectPoint = collectPoint; + } + + public String getCollectRequiredTime() { + return collectRequiredTime; + } + + public void setCollectRequiredTime(String collectRequiredTime) { + this.collectRequiredTime = collectRequiredTime; + } + + public String getCollectAmount() { + return collectAmount; + } + + public void setCollectAmount(String collectAmount) { + this.collectAmount = collectAmount; + } + + public String getCollectActualTime() { + return collectActualTime; + } + + public void setCollectActualTime(String collectActualTime) { + this.collectActualTime = collectActualTime; + } + + public String getCollectActualAmount() { + return collectActualAmount; + } + + public void setCollectActualAmount(String collectActualAmount) { + this.collectActualAmount = collectActualAmount; + } + + public String getUncollectActualAmount() { + return uncollectActualAmount; + } + + public void setUncollectActualAmount(String uncollectActualAmount) { + this.uncollectActualAmount = uncollectActualAmount; + } + + public String getTimeOutDay() { + return timeOutDay; + } + + public void setTimeOutDay(String timeOutDay) { + this.timeOutDay = timeOutDay; + } + + public String getProductCertificate() { + return productCertificate; + } + + public void setProductCertificate(String productCertificate) { + this.productCertificate = productCertificate; + } + + public String getInspectionReportTime() { + return inspectionReportTime; + } + + public void setInspectionReportTime(String inspectionReportTime) { + this.inspectionReportTime = inspectionReportTime; + } + + public String getRiskWarning() { + return riskWarning; + } + + public void setRiskWarning(String riskWarning) { + this.riskWarning = riskWarning; + } + + public String getCalColAmount() { + return calColAmount; + } + + public void setCalColAmount(String calColAmount) { + this.calColAmount = calColAmount; + } + + public String getUncalColAmount() { + return uncalColAmount; + } + + public void setUncalColAmount(String uncalColAmount) { + this.uncalColAmount = uncalColAmount; + } +} diff --git a/src/main/java/cn/palmte/work/model/MonthlySettleRepository.java b/src/main/java/cn/palmte/work/model/MonthlySettleRepository.java new file mode 100644 index 0000000..9da6d2f --- /dev/null +++ b/src/main/java/cn/palmte/work/model/MonthlySettleRepository.java @@ -0,0 +1,11 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +public interface MonthlySettleRepository extends JpaRepository { + +} diff --git a/src/main/java/cn/palmte/work/model/MonthlySettleRepositoryCustom.java b/src/main/java/cn/palmte/work/model/MonthlySettleRepositoryCustom.java new file mode 100644 index 0000000..7b572e2 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/MonthlySettleRepositoryCustom.java @@ -0,0 +1,8 @@ +package cn.palmte.work.model; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +public interface MonthlySettleRepositoryCustom { +} diff --git a/src/main/java/cn/palmte/work/model/MonthlySettleRepositoryCustomImpl.java b/src/main/java/cn/palmte/work/model/MonthlySettleRepositoryCustomImpl.java new file mode 100644 index 0000000..971c8cb --- /dev/null +++ b/src/main/java/cn/palmte/work/model/MonthlySettleRepositoryCustomImpl.java @@ -0,0 +1,12 @@ +package cn.palmte.work.model; + +import org.springframework.stereotype.Repository; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +@Repository +public class MonthlySettleRepositoryCustomImpl implements MonthlySettleRepositoryCustom { + +} diff --git a/src/main/java/cn/palmte/work/service/MonthlySettleService.java b/src/main/java/cn/palmte/work/service/MonthlySettleService.java new file mode 100644 index 0000000..48a45b4 --- /dev/null +++ b/src/main/java/cn/palmte/work/service/MonthlySettleService.java @@ -0,0 +1,29 @@ +package cn.palmte.work.service; + +import cn.palmte.work.controller.backend.MonthlySettleController; +import cn.palmte.work.model.MonthlySettle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import top.jfunc.common.db.bean.Page; + +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +@Service +public class MonthlySettleService { + private static final Logger logger = LoggerFactory.getLogger(MonthlySettleController.class); + + public Page list(Map searchInfo, int pageNumber, int pageSize) { + return null; + } + + public String check(Collection maps) { + return null; + } +} diff --git a/src/main/java/cn/palmte/work/service/NumSeqService.java b/src/main/java/cn/palmte/work/service/NumSeqService.java new file mode 100644 index 0000000..94f8a2c --- /dev/null +++ b/src/main/java/cn/palmte/work/service/NumSeqService.java @@ -0,0 +1,33 @@ +package cn.palmte.work.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + +/** + * @author Yuanping Zhang + * @date 2022/08/08 + */ +@Service +public class NumSeqService { + private static final Logger logger = LoggerFactory.getLogger(NumSeqService.class); + + @Autowired + @PersistenceContext + private EntityManager entityManager; + + public String generate() { + String prefix = "P"; + String querySql = "select num from num_seq limit 1"; + Query nativeQuery = entityManager.createNativeQuery(querySql); + int num = (Integer)nativeQuery.getSingleResult(); + String counterString = String.format("%05d", num++); + entityManager.createNativeQuery("update num_seq set num = " + num); + return prefix + counterString; + } +} diff --git a/src/main/resources/templates/admin/monthly_settle_list.ftl b/src/main/resources/templates/admin/monthly_settle_list.ftl new file mode 100644 index 0000000..efa472a --- /dev/null +++ b/src/main/resources/templates/admin/monthly_settle_list.ftl @@ -0,0 +1,355 @@ +<#assign base=request.contextPath /> +<#import "../common/defaultLayout.ftl" as defaultLayout> +<@defaultLayout.layout> + +
+
+ +
项目管理 / + 月度结算 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
姓名 +
+ +
+
手机号 +
+ +
+
工号 +
+ +
+
一级部门 +
+ +
+
角色名称 +
+ +
+
常驻地 +
+ +
+
创建时间 +
+
+
+ + +
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#list pager.list as list> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
项目编号最终业主合同方项目名称合同金额累计已收款已采购累计付款已采购累计未付款超期垫资金额销售累计开票金额合同编号项目类型合同签订时间销售经理项目经理收款节点收款要求时间收款金额实际收款时间实际收款金额实际欠收金额超期天数到货证明验收报告时间项目风险预警已计收金额未计收金额
${list.projectNo!}${list.owner!}${list.contractParty!}${list.projectName!}${list.contractAmount!}${list.totalCollect!}${list.totalPurchasedPaid!}${list.totalPurchasedUnpaid!}${list.timeOutAmount!}${list.totalBillAmount!}${list.contractNo!}${list.projectType!}${list.contractSignTime!}${list.saleManager!}${list.projectManager!}${list.collectPoint!}${list.collectRequiredTime!}${list.collectAmount!}${list.collectActualTime!}${list.collectActualAmount!}${list.uncollectActualAmount!}${list.timeOutDay!}${list.productCertificate!}${list.inspectionReportTime!}${list.riskWarning!}${list.calColAmount!}${list.uncalColAmount!}
+
+
+ + <#if (pager.list)?exists && (pager.list?size>0) > +
+ <#include "../common/common_pager.ftl"> +
+ <#else> +
+

没有找到任何记录!

+
+ +
+ +
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +