Przeglądaj źródła

新增按考点统计扫描进度;导出验收报告

ting.yin 1 rok temu
rodzic
commit
32f98aaf2c

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -265,4 +265,10 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     @Query("update ExamStudent s set s.trial=?3 where s.examId=?1 and s.subjectCode=?2 ")
     public void updateTrial(Integer examId, String subjectCode, boolean trial);
 
+    @Query("select s.examSite from ExamStudent s where s.examId=?1 group by s.examSite")
+    public List<String> findDistinctExamSite(int examId);
+
+    @Query("select sum(s.sheetCount) from ExamStudent s where s.examId=?1 and s.examSite=?2 ")
+    public Long sumSheetCountByExamIdAndExamSite(int examId, String examSite);
+
 }

+ 9 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -192,6 +192,14 @@ public interface ExamStudentService {
 
     public void resetTrial(Integer examId, String subjectCode, boolean trial);
 
-	public void cancelInspect(int examId, String subjectCode);
+    public void cancelInspect(int examId, String subjectCode);
+
+    public List<String> findDistinctExamSite(int examId);
+
+    public long countByExamIdAndExamSite(int examId, String examSite);
+
+    public long countByExamIdAndExamSite(int examId, String examSite, boolean upload);
+
+    public long countSheetCountByExamIdAndExamSite(int examId, String examSite);
 
 }

+ 28 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -1546,4 +1546,32 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public void cancelInspect(int examId, String subjectCode) {
         studentDao.cancelInspect(examId, subjectCode);
     }
+
+    @Override
+    public List<String> findDistinctExamSite(int examId) {
+        return studentDao.findDistinctExamSite(examId);
+    }
+
+    @Override
+    public long countByExamIdAndExamSite(int examId, String examSite) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setExamSite(examSite);
+        return countByQuery(query);
+    }
+
+    @Override
+    public long countByExamIdAndExamSite(int examId, String examSite, boolean upload) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setExamSite(examSite);
+        query.setUpload(upload);
+        return countByQuery(query);
+    }
+
+    @Override
+    public long countSheetCountByExamIdAndExamSite(int examId, String examSite) {
+        Long count = studentDao.sumSheetCountByExamIdAndExamSite(examId, examSite);
+        return count == null ? 0 : count;
+    }
 }

+ 25 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
@@ -36,6 +37,8 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.school.model.School;
+import cn.com.qmth.stmms.biz.school.service.SchoolService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
@@ -69,6 +72,15 @@ public class ExamController extends BaseExamController {
     @Autowired
     private FileService fileService;
 
+    @Autowired
+    private SchoolService schoolService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
     @Logging(menu = "查询考试", type = LogType.QUERY)
     @RoleRequire(Role.SCHOOL_ADMIN)
     @RequestMapping(value = { "/list" })
@@ -288,4 +300,17 @@ public class ExamController extends BaseExamController {
         SessionExamUtils.setExamId(request, exam);
         return "redirect:/admin/home";
     }
+
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.SCHOOL_VIEWER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
+    @RequestMapping(value = "view/{examId}/export", method = RequestMethod.GET)
+    public String exportExam(Model model, HttpServletRequest request, @PathVariable Integer examId) {
+        Exam exam = examService.findById(examId);
+        School school = schoolService.findById(exam.getSchoolId());
+        model.addAttribute("schoolName", school.getName());
+        model.addAttribute("year", Calendar.getInstance().get(Calendar.YEAR));
+        model.addAttribute("subjectCount", subjectService.count(examId));
+        model.addAttribute("studentCount", studentService.countByExamId(examId));
+        model.addAttribute("sheetCount", studentService.countSheetCountByExamId(examId) / 2);
+        return "modules/exam/examExport";
+    }
 }

+ 43 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import cn.com.qmth.stmms.admin.utils.PageUtil;
 import cn.com.qmth.stmms.admin.vo.ScanInfoVO;
 import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
@@ -159,7 +160,7 @@ public class ScanController extends BaseExamController {
     }
 
     @Logging(menu = "扫描进度导出", type = LogType.EXPORT)
-    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @RequestMapping(value = "/subject/export", method = RequestMethod.POST)
     public String export(ExamSubjectSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
@@ -190,4 +191,45 @@ public class ScanController extends BaseExamController {
             return "redirect:/admin/exam/scan/subject";
         }
     }
+
+    @Logging(menu = "扫描进度-按考点查询", type = LogType.QUERY)
+    @RequestMapping("/examSite")
+    public ModelAndView examSite(HttpServletRequest request, ExamStudentSearchQuery query) {
+        int examId = getSessionExamId(request);
+        List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
+        if (StringUtils.isBlank(query.getExamSite())) {
+            List<String> result = studentService.findDistinctExamSite(examId);
+            List<?> examSiteList = PageUtil.startPage(result, query.getPageNumber(), query.getPageSize());
+            for (Object e : examSiteList) {
+                ScanInfoVO vo = new ScanInfoVO();
+                String examSite = (String) e;
+                vo.setName(examSite);
+                vo.setTotalCount(studentService.countByExamIdAndExamSite(examId, examSite));
+                vo.setScanCount(studentService.countByExamIdAndExamSite(examId, examSite, true));
+                vo.setScanSheetCount(studentService.countSheetCountByExamIdAndExamSite(examId, examSite) / 2);
+                list.add(vo);
+            }
+            query.setTotalCount(result.size());
+            query.setTotalPage(PageUtil.pageCount(result, query.getPageNumber(), query.getPageSize()));
+            query.setCurrentCount(examSiteList.size());
+        } else {
+            ScanInfoVO vo = new ScanInfoVO();
+            vo.setName(query.getExamSite());
+            vo.setTotalCount(studentService.countByExamIdAndExamSite(examId, query.getCampusName()));
+            vo.setScanCount(studentService.countByExamIdAndExamSite(examId, query.getCampusName(), true));
+            vo.setScanSheetCount(studentService.countSheetCountByExamIdAndExamSite(examId, query.getExamSite()) / 2);
+            list.add(vo);
+
+            query.setTotalCount(1);
+            query.setTotalPage(1);
+            query.setCurrentCount(1);
+        }
+
+        ModelAndView view = new ModelAndView("modules/exam/scanInfo");
+        view.addObject("examSiteList", studentService.findDistinctExamSite(examId));
+        view.addObject("infoList", list);
+        view.addObject("query", query);
+        view.addObject("type", "examSite");
+        return view;
+    }
 }

+ 4 - 4
stmms-web/src/main/webapp/WEB-INF/application.properties

@@ -1,13 +1,13 @@
 #\u6570\u636e\u5e93\u914d\u7f6e
 jdbc.driver=com.mysql.jdbc.Driver
-jdbc.url=jdbc:mysql://localhost:3306/stmms-ft?useUnicode=true&characterEncoding=UTF-8
+jdbc.url=jdbc:mysql://localhost:3306/stmms_ft_test?useUnicode=true&characterEncoding=UTF-8
 jdbc.username=root
-jdbc.password=123456
+jdbc.password=root
 jdbc.maxActive=50
 jdbc.initSize=5
 ##\u6587\u4ef6\u5b58\u50a8\u914d\u7f6e
-file.store=/home/admin/project/stmms-ft/static
-file.temp=/home/admin/project/stmms-ft/static
+file.store=/Users/ting.yin/work/static/stmms-ft
+file.temp=/Users/ting.yin/work/static/stmms-ft
 ##\u88c1\u5207\u56fe\u9ed8\u8ba4\u5207\u5272\u89c4\u5219
 slice.split.config=0,0.55,0.45,0.55
 ##\u9ed8\u8ba4\u95ee\u9898\u5377\u7c7b\u578b

+ 180 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examExport.jsp

@@ -0,0 +1,180 @@
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>Document</title>
+  <link rel="stylesheet" href="${ctxStatic}/exam-report/css/index.css" />
+  <script src="${ctxStatic}/exam-report/js/index.js"></script>
+  <script src="${ctxStatic}/exam-report/js/html2canvas.min.js"></script>
+  <script src="${ctxStatic}/exam-report/js/jspdf.umd.min.js"></script>
+  <!-- <style media="print">
+    @page {
+        size: auto;
+        margin: 3mm;
+    }
+     
+    html {
+        background-color: #ffffff;
+        height: auto;
+        margin: 0px;
+    }
+  </style> -->
+</head>
+
+<body>
+  <div id="accept-report">
+    <div class="report-head">
+      <img src="${ctxStatic}/exam-report/imgs/logo.png"  />
+      <div class="company-name">
+        <span>武汉启明泰和软件服务有限公司</span>
+      </div>
+    </div>
+    <div class="report-title bold">项目验收报告</div>
+    <div class="out-box">
+      <img class="bg-img" src="${ctxStatic}/exam-report/imgs/logo.png" />
+      <div class="in-box">
+        <div class="tr">
+          <div class="td td1">
+            <div>
+              <p>项目</p>
+              <p>名称</p>
+            </div>
+          </div>
+          <div class="td bold project-name">
+            <span class="border-b"> <input style="width: 270px" value="${schoolName }"/> </span><span class="report-year">${year }</span>年研究生自命题电子阅卷项目
+          </div>
+        </div>
+        <div class="tr">
+          <div class="td td1">
+            <div>
+              <p>验</p>
+              <p>收</p>
+              <p>结</p>
+              <p>果</p>
+            </div>
+          </div>
+          <div class="td project-detail">
+            <p class="text-indent">
+              武汉启明泰和软件服务有限公司按照我方要求,完成了本项目全部技术服务任务内容,如下:
+            </p>
+            <p class="title bold">1、扫描阅卷</p>
+            <p class="text-indent">
+              已完成采集电子图像共<span class="border-b"><input class="w60" value="${subjectCount }"</></span>科目,
+              <span class="border-b"><input class="w60" value="${studentCount }"</></span>科次
+              <span class="border-b"><input class="w60" value="${sheetCount}"</></span>张答题卡,扫描阅卷过程规范,按时完成整个项目、结果无错误。
+            </p>
+            <table class="my-table" border="1">
+              <thead>
+                <tr>
+                  <th>答题卡规格</th>
+                  <th>科次</th>
+                  <th>答题卡数量(张)</th>
+                  <th>签到表规格</th>
+                  <th>签到表数量(张)</th>
+                  <th>小计(张)</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td>
+                    <input value="A3" />
+                  </td>
+                  <td><input value="${subjectCount}"/></td>
+                  <td><input value="${sheetCount}" /></td>
+                  <td><input /></td>
+                  <td><input /></td>
+                  <td><input /></td>
+                </tr>
+                <tr>
+                  <td>
+                    <input />
+                  </td>
+                  <td><input /></td>
+                  <td><input /></td>
+                  <td><input /></td>
+                  <td><input /></td>
+                  <td><input /></td>
+                </tr>
+                <tr>
+                  <td>
+                    <input />
+                  </td>
+                  <td><input /></td>
+                  <td><input /></td>
+                  <td><input /></td>
+                  <td><span class="bold">共计:</span></td>
+                  <td><input value="${sheetCount }"/></td>
+                </tr>
+              </tbody>
+            </table>
+            <div style="margin-top:10px;text-align: right;">
+              <span class="bold">验收意见:</span>
+              <input type="checkbox" name="aaa">通过</input>
+              <input type="checkbox" name="aaa">不通过</input>
+              <span class="bold" style="margin-left:10px;">验收人:</span>
+              <span class="border-b">
+                <input class="w70" />
+              </span>
+              <span class="bold" style="margin-left:6px;">日期:</span>
+              <span class="border-b">
+                <input class="w95" />
+              </span>
+            </div>
+
+            <p class="title bold" style="margin-top:24px;">2、条码印刷</p>
+            <p class="text-indent">
+              已完成条码印刷共计<span class="border-b"><input class="w60"/></span>科目
+              <span class="border-b"><input class="w60"/></span>张
+            </p>
+            <p class="text-indent">
+              条码文件交接完整,无错误,无遗留,无错装。
+            </p>
+            <div style="margin-top:6px;text-align: right;">
+              <span class="bold">验收意见:</span>
+              <input type="checkbox" name="bbb">通过</input>
+              <input type="checkbox" name="bbb">不通过</input>
+              <span class="bold" style="margin-left:6px;">验收人:</span>
+              <span class="border-b">
+                <input class="w70" />
+              </span>
+              <span class="bold" style="margin-left:6px;">日期:</span>
+              <span class="border-b">
+                <input class="w95" />
+              </span>
+            </div>
+          </div>
+        </div>
+        <div class="tr">
+          <div class="td td1">
+            <div>
+              <p>改进</p>
+              <p>建议</p>
+            </div>
+          </div>
+          <div class="td">
+            <textarea style="height:140px;width:100%;border:none;outline: none;resize: none;"></textarea>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="report-foot">
+      <div>
+        <p>交验方:武汉启明泰和软件服务有限公司(盖章)</p>
+        <p>技术负责人(签字):<input style="text-align:left;width:100px" /></p>
+        <p>交验日期:<span class="border-b"><input class="w60" /></span>年<span class="border-b"><input
+              class="w40" /></span>月<span class="border-b"><input class="w40" /></span>日</p>
+      </div>
+      <div>
+        <p>验收方:</p>
+        <p>&nbsp;</p>
+        <p>验收代表(签字):<input style="text-align:left;width:100px" /></p>
+        <p>交验日期:<span class="border-b"><input class="w60" /></span>年<span class="border-b"><input
+              class="w40" /></span>月<span class="border-b"><input class="w40" /></span>日</p>
+      </div>
+    </div>
+  </div>
+</body>
+</html>

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examInfo.jsp

@@ -31,9 +31,9 @@
 		</tbody>
 	</table>
 	<div>
-		<label>验收报告:</label>
+		<label><a class="btn" target="_blank"  href="${ctx}/admin/exam/view/${exam.id}/export">验收报告</a></label>
 		&nbsp;
-		<a class="btn" href="${ctxStatic}/download/研究生项目验收报告模板.docx">导出</a>
+		<%-- <a class="btn" href="${ctxStatic}/download/研究生项目验收报告模板.docx">导出</a> --%>
 	</div>
 </body>
 </html>

+ 19 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanInfo.jsp

@@ -10,6 +10,7 @@
 <body>
 	<ul class="nav nav-tabs">
 		<li <c:if test="${type=='subject'}">class="active"</c:if>><a href="${ctx}/admin/exam/scan/subject">按科目统计</a></li>
+		<li <c:if test="${type=='examSite'}">class="active"</c:if>><a href="${ctx}/admin/exam/scan/examSite">按考点统计</a></li>
 		<!--<li <c:if test="${type=='campus'}">class="active"</c:if>><a href="${ctx}/admin/exam/scan/campus">按学习中心统计</a></li>-->
 		<li><a href="${ctx}/admin/exam/scan/package">统计签到表</a></li>
 	</ul>
@@ -55,17 +56,32 @@
 			</c:forEach>
 		</select>
 		</c:if>
+		
+		<c:if test="${type=='examSite'}">
+		<label>考点</label>
+		<select class="input-large" name="examSiteList">
+			<option value="">全部</option>
+			<c:forEach items="${examSiteList}" var="examSite">
+			<option value="${examSite}" <c:if test="${examSite==query.examSite}">selected</c:if>>${examSite}</option>
+			</c:forEach>
+		</select>
+		</c:if>
 		&nbsp;
 		<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-		<c:if test="${type=='subject'}">
+		<c:if test="${type=='subject'|| type=='examSite'}">
 		&nbsp;
 			<input id="btnExport" class="btn btn-primary" type="button" value="导出" onclick="goExport()"/>
 		</c:if>
 	</form>
-	<form id="exportForm" action="${ctx}/admin/exam/scan/export" method="post" class="breadcrumb form-search hide">
-		<input type="text" name="code" value="${query.code}" maxlength="10" class="input-mini"/>
+	<form id="exportForm" action="${ctx}/admin/exam/scan/${type}/export" method="post" class="breadcrumb form-search hide">
+		<c:if test="${type=='subject'}">
+		<input type="text" name="code" value="${query.code}" maxlength="100" class="input-mini"/>
 		<input type="text" name="category" value="${query.category}" maxlength="20" class="input-small"/>
         <input type="text" name="level" value="${query.level}" maxlength="64" class="input-mini"/>
+		</c:if>
+		<c:if test="${type=='examSite'}">
+		<input type="text" name="examSite" value="${query.examSite}" maxlength="100" class="input-mini"/>
+		</c:if>
 	</form>
 	<table id="contentTable" class="table table-striped table-bordered table-condensed">
 		<thead>

+ 1 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanPackage.jsp

@@ -13,6 +13,7 @@
 <body>
 <ul class="nav nav-tabs">
     <li><a href="${ctx}/admin/exam/scan/subject">按科目统计</a></li>
+    <li><a href="${ctx}/admin/exam/scan/examSite">按考点统计</a></li>
     <!--<li><a href="${ctx}/admin/exam/scan/campus">按学习中心统计</a></li>-->
     <li class="active"><a href="${ctx}/admin/exam/scan/package">统计签到表</a></li>
 </ul>

+ 175 - 0
stmms-web/src/main/webapp/static/exam-report/css/index.css

@@ -0,0 +1,175 @@
+#accept-report {
+  width: 600px;
+  color: #000;
+  padding: 0 10px;
+  margin: 0 auto;
+  font-size: 14px;
+}
+#accept-report .text-indent {
+  text-indent: 2em;
+}
+#accept-report .w30 {
+  width: 30px;
+}
+#accept-report .w40 {
+  width: 40px;
+}
+#accept-report .w60 {
+  width: 60px;
+}
+#accept-report .w70 {
+  width: 70px;
+}
+#accept-report .w95 {
+  width: 95px;
+}
+#accept-report .w100 {
+  width: 100%;
+}
+#accept-report .h100 {
+  height: 100%;
+}
+#accept-report input {
+  line-height: inherit;
+  vertical-align: baseline;
+  border: none;
+  outline: none;
+  padding: 0 6px;
+  font-weight: inherit;
+  font-size: inherit;
+  color: inherit;
+  background-color: transparent;
+  text-align: center;
+}
+#accept-report input[type="checkbox"] {
+  position: relative;
+  bottom: -1px;
+}
+#accept-report * {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+#accept-report .bold {
+  font-weight: bold;
+}
+#accept-report .border-b {
+  border-bottom: 1px solid #000;
+}
+#accept-report .report-head {
+  display: flex;
+  align-items: center;
+  height: 24px;
+  margin-bottom: 30px;
+  padding-top: 10px;
+}
+#accept-report .report-head img {
+  height: 100%;
+}
+#accept-report .report-head .company-name {
+  text-align: right;
+  letter-spacing: 5px;
+  border-bottom: 1px solid #000;
+  flex: 1;
+  font-size: 8px;
+  margin-left: 30px;
+}
+#accept-report .report-title {
+  font-size: 22px;
+  text-align: center;
+  letter-spacing: 12px;
+}
+#accept-report .out-box {
+  margin-top: 20px;
+  border: 2px solid #000;
+  padding: 2px;
+  position: relative;
+}
+#accept-report .out-box .bg-img {
+  position: absolute;
+  z-index: 1;
+  transform: translateX(-50%) translateY(-90%) rotate(-45deg);
+  left: 50%;
+  top: 50%;
+  height: 56px;
+  opacity: 0.2;
+}
+#accept-report .in-box {
+  border: 1px solid #000;
+  position: relative;
+  z-index: 10;
+}
+#accept-report .in-box .tr {
+  display: flex;
+  align-items: center;
+}
+#accept-report .in-box .tr .project-name {
+  font-size: 22px;
+  text-align: center;
+  line-height: 34px;
+}
+#accept-report .in-box .tr:not(:first-child) {
+  border-top: 1px solid #000;
+}
+#accept-report .in-box .tr .td {
+  padding: 6px;
+  height: 100%;
+}
+#accept-report .in-box .tr .td:not(:first-child) {
+  border-left: 1px solid #000;
+  flex: 1;
+}
+#accept-report .in-box .tr .td:not(:first-child) p {
+  line-height: 20px;
+}
+#accept-report .in-box .tr .td.td1 {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-size: 20px;
+  width: 80px;
+  text-align: center;
+  font-weight: bold;
+}
+#accept-report .in-box .tr .td.td1 p:not(:first-child) {
+  margin-top: 10px;
+}
+#accept-report .in-box .tr .td .title {
+  margin-top: 3px;
+}
+#accept-report .in-box .tr .td .my-table {
+  width: 100%;
+  text-align: center;
+  border-collapse: collapse;
+  margin-top: 3px;
+}
+#accept-report .in-box .tr .td .my-table th,
+#accept-report .in-box .tr .td .my-table td {
+  width: 16.6%;
+  padding: 10px;
+}
+#accept-report .in-box .tr .td .my-table th {
+  font-weight: bold;
+  font-size: 14px;
+}
+#accept-report .in-box .tr .td .my-table td {
+  height: 28px;
+  padding: 0;
+}
+#accept-report .in-box .tr .td .my-table td input {
+  width: 100%;
+  height: 100%;
+}
+#accept-report .report-foot {
+  margin-top: 6px;
+  display: flex;
+  justify-content: space-between;
+  padding: 0 10px;
+}
+#accept-report .report-foot p {
+  font-size: 16px;
+  line-height: 24px;
+}
+#accept-report .report-foot > div {
+  width: calc(50% - 15px);
+}

+ 180 - 0
stmms-web/src/main/webapp/static/exam-report/css/index.less

@@ -0,0 +1,180 @@
+#accept-report {
+  width: 600px;
+  color: #000;
+  padding: 0 10px;
+  margin: 0 auto;
+  .text-indent {
+    text-indent: 2em;
+  }
+  font-size: 14px;
+  .w30 {
+    width: 30px;
+  }
+  .w40 {
+    width: 40px;
+  }
+  .w60 {
+    width: 60px;
+  }
+  .w70 {
+    width: 70px;
+  }
+  .w95 {
+    width: 95px;
+  }
+  .w100 {
+    width: 100%;
+  }
+  .h100 {
+    height: 100%;
+  }
+  input {
+    // height: 100%;
+    line-height: inherit;
+    vertical-align: baseline;
+    border: none;
+    outline: none;
+    padding: 0 6px;
+    font-weight: inherit;
+    font-size: inherit;
+    color: inherit;
+    background-color: transparent;
+    text-align: center;
+    &[type="checkbox"] {
+      position: relative;
+      bottom: -1px;
+    }
+  }
+  * {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+  }
+  .bold {
+    font-weight: bold;
+  }
+  .border-b {
+    border-bottom: 1px solid #000;
+  }
+  .report-head {
+    display: flex;
+    align-items: center;
+    height: 24px;
+    margin-bottom: 30px;
+    padding-top: 10px;
+    img {
+      height: 100%;
+    }
+    .company-name {
+      text-align: right;
+      letter-spacing: 5px;
+      border-bottom: 1px solid #000;
+      flex: 1;
+      font-size: 8px;
+      margin-left: 30px;
+    }
+  }
+  .report-title {
+    font-size: 22px;
+    text-align: center;
+    letter-spacing: 12px;
+  }
+  .out-box {
+    margin-top: 20px;
+    border: 2px solid #000;
+    padding: 2px;
+    position: relative;
+    .bg-img {
+      position: absolute;
+      z-index: 1;
+      transform: translateX(-50%) translateY(-90%) rotate(-45deg);
+      left: 50%;
+      top: 50%;
+      height: 56px;
+      opacity: 0.2;
+    }
+  }
+  .in-box {
+    border: 1px solid #000;
+    position: relative;
+    z-index: 10;
+
+    .tr {
+      display: flex;
+      align-items: center;
+      .project-name {
+        font-size: 22px;
+        text-align: center;
+        line-height: 34px;
+      }
+      &:not(:first-child) {
+        border-top: 1px solid #000;
+      }
+      .td {
+        height: 100%;
+        padding: 6px;
+        height: 100%;
+        &:not(:first-child) {
+          border-left: 1px solid #000;
+          flex: 1;
+          p {
+            line-height: 20px;
+          }
+        }
+        &.td1 {
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          font-size: 20px;
+          width: 80px;
+          text-align: center;
+          font-weight: bold;
+          p {
+            &:not(:first-child) {
+              margin-top: 10px;
+            }
+          }
+        }
+        .title {
+          margin-top: 3px;
+        }
+        .my-table {
+          width: 100%;
+          text-align: center;
+          border-collapse: collapse;
+          margin-top: 3px;
+          th,
+          td {
+            width: 16.6%;
+            padding: 10px;
+          }
+          th {
+            font-weight: bold;
+            font-size: 14px;
+          }
+          td {
+            height: 28px;
+            padding: 0;
+            input {
+              width: 100%;
+              height: 100%;
+            }
+          }
+        }
+      }
+    }
+  }
+  .report-foot {
+    margin-top: 6px;
+    display: flex;
+    justify-content: space-between;
+    padding: 0 10px;
+    p {
+      font-size: 16px;
+      line-height: 24px;
+    }
+    & > div {
+      width: calc(50% - 15px);
+    }
+  }
+}

BIN
stmms-web/src/main/webapp/static/exam-report/imgs/logo.png


Plik diff jest za duży
+ 19 - 0
stmms-web/src/main/webapp/static/exam-report/js/html2canvas.min.js


+ 51 - 0
stmms-web/src/main/webapp/static/exam-report/js/index.js

@@ -0,0 +1,51 @@
+function createPdfPage(canvas) {
+  var contentWidth = canvas.width;
+  var contentHeight = canvas.height;
+  var pageHeight = (contentWidth / 592.28) * 841.89;
+  var leftHeight = contentHeight;
+  var position = 0;
+  var imgWidth = 595.28;
+  var imgHeight = (592.28 / contentWidth) * contentHeight;
+  var pageData = canvas.toDataURL("image/jpeg", 1.0);
+  var pdf = new window.jspdf.jsPDF("", "pt", "a4");
+  if (leftHeight < pageHeight) {
+    pdf.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
+  } else {
+    while (leftHeight > 0) {
+      pdf.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
+      leftHeight -= pageHeight;
+      position -= 841.89;
+      if (leftHeight > 0) {
+        pdf.addPage();
+      }
+    }
+  }
+  pdf.save(`项目验收报告.pdf`);
+}
+/**
+ * 想保存为pdf的话,直接调这个getPdf方法就行
+ */
+function getPdf() {
+  var canvas = document.createElement("canvas");
+  var context = canvas.getContext("2d");
+  var _articleHtml = document.getElementById("accept-report");
+  var _w = _articleHtml.clientWidth;
+  var _h = _articleHtml.clientHeight;
+  var scale = 3;
+  if (_w > _h) {
+    _h = _w;
+  }
+  canvas.width = _w * scale;
+  canvas.height = _h * scale;
+  context.scale(scale, scale);
+  var opts = {
+    scale: 1,
+    width: _w,
+    height: _h,
+    canvas: canvas,
+    useCORS: true,
+  };
+  html2canvas(_articleHtml, opts).then((canvas) => {
+    createPdfPage(canvas);
+  });
+}

Plik diff jest za duży
+ 50 - 0
stmms-web/src/main/webapp/static/exam-report/js/jspdf.umd.min.js


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików