user5 8 hónapja
szülő
commit
1bc740a9e0
22 módosított fájl, 290 hozzáadás és 82 törlés
  1. 2 2
      src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsService.java
  2. 3 0
      src/main/java/com/jeeplus/modules/sys/dao/UserDao.java
  3. 9 0
      src/main/java/com/jeeplus/modules/sys/entity/User.java
  4. 16 0
      src/main/java/com/jeeplus/modules/sys/service/SystemService.java
  5. 29 0
      src/main/java/com/jeeplus/modules/sys/service/UserService.java
  6. 1 0
      src/main/java/com/jeeplus/modules/sys/web/LoginController.java
  7. 3 1
      src/main/java/com/jeeplus/modules/sys/web/UserController.java
  8. 17 0
      src/main/java/com/jeeplus/modules/workcalendar/service/WorkCalendarTaskService.java
  9. 4 2
      src/main/java/com/jeeplus/modules/workreimbursement/web/WorkReimbursementController.java
  10. 1 1
      src/main/resources/jeeplus.properties
  11. 0 4
      src/main/resources/mappings/modules/ruralprojectrecords/RuralProjectRecordsDao.xml
  12. 14 1
      src/main/resources/mappings/modules/sys/UserDao.xml
  13. 28 4
      src/main/webapp/static/common/js/common.js
  14. 1 1
      src/main/webapp/webpage/include/head.jsp
  15. 6 6
      src/main/webapp/webpage/modules/sys/adminModifyPwdForm.jsp
  16. 29 1
      src/main/webapp/webpage/modules/sys/sysIndex.jsp
  17. 15 10
      src/main/webapp/webpage/modules/sys/sysLogin.jsp
  18. 37 30
      src/main/webapp/webpage/modules/sys/userInfo.jsp
  19. 45 17
      src/main/webapp/webpage/modules/sys/userModifyPwd.jsp
  20. 1 1
      src/main/webapp/webpage/modules/workreimbursement/all/workReimbursementAllFormAdd.jsp
  21. 3 1
      src/main/webapp/webpage/modules/workreimbursement/replenish/workReimbursementReplenishCwAudit.jsp
  22. 26 0
      src/main/webapp/webpage/modules/workstaff/workStaffBasicInfoList.jsp

+ 2 - 2
src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsService.java

@@ -825,7 +825,7 @@ public class RuralProjectRecordsService extends CrudService<RuralProjectRecordsD
 					}
 				} else if ("2".equals(projectRecords.getProjectType())) {	//造价审核
 					//预算审核、结算审核、分包审核 需要纸质归档
-					if ("2".equals(projectRecords.getAttachmentProjectSort()) || "4".equals(projectRecords.getAttachmentProjectSort()) || "7".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort())) {
+					if ("2".equals(projectRecords.getAttachmentProjectSort()) || "4".equals(projectRecords.getAttachmentProjectSort()) || "7".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort()) || "11".equals(projectRecords.getAttachmentProjectSort())) {
 						assert createBy != null;
 						projectRecords.setPaperFilingStatus("");
 						projectRecords.setProjectId(serialNumTplService.genSerialNum(createBy.getCompany(), RuralProjectRecords.SERIAL_COST_BIZCODE));
@@ -850,7 +850,7 @@ public class RuralProjectRecordsService extends CrudService<RuralProjectRecordsD
 					}
 				} else if ("2".equals(projectRecords.getProjectType())) {	//造价审核
 					//预算审核、结算审核、分包审核 需要纸质归档
-					if ("2".equals(projectRecords.getAttachmentProjectSort()) || "4".equals(projectRecords.getAttachmentProjectSort()) || "7".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort())) {
+					if ("2".equals(projectRecords.getAttachmentProjectSort()) || "4".equals(projectRecords.getAttachmentProjectSort()) || "7".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort()) || "11".equals(projectRecords.getAttachmentProjectSort())) {
 						projectRecords.setPaperFilingStatus(null);
 					}else{
 						projectRecords.setPaperFilingStatus("10");

+ 3 - 0
src/main/java/com/jeeplus/modules/sys/dao/UserDao.java

@@ -356,4 +356,7 @@ public interface UserDao extends CrudDao<User> {
 	 * @return
 	 */
 	List<User> getIncludeQwUserIdAllUserList();
+
+
+	void updateUpdatePasswordDate(User user);
 }

+ 9 - 0
src/main/java/com/jeeplus/modules/sys/entity/User.java

@@ -98,6 +98,7 @@ public class User extends DataEntity<User> {
 	private String auditStatus;
 	private String home;
 	private String firstFlag;
+	private Date updatePasswordDate;	//修改密码时间
     private WorkStaffBasicInfo basicInfo;
 
     private String weChatId;
@@ -603,6 +604,14 @@ public class User extends DataEntity<User> {
         this.firstFlag = firstFlag;
     }
 
+	public Date getUpdatePasswordDate() {
+		return updatePasswordDate;
+	}
+
+	public void setUpdatePasswordDate(Date updatePasswordDate) {
+		this.updatePasswordDate = updatePasswordDate;
+	}
+
 	public String getAuditUserId() {
 		return auditUserId;
 	}

+ 16 - 0
src/main/java/com/jeeplus/modules/sys/service/SystemService.java

@@ -655,6 +655,22 @@ public class SystemService extends BaseService implements InitializingBean {
         User user = new User(id);
         user.setPassword(entryptPassword(newPassword));
         user.setPasswordRemake(newPassword);
+        user.setUpdatePasswordDate(new Date());
+        user.setFirstFlag("0");
+        userDao.updatePasswordById(user);
+        // 清除用户缓存
+        user.setLoginName(loginName);
+        UserUtils.clearCache(user);
+        // // 清除权限缓存
+        // systemRealm.clearAllCachedAuthorizationInfo();
+    }
+
+    @Transactional(readOnly = false)
+    public void adminUpdatePasswordById(String id, String loginName,
+                                   String newPassword) {
+        User user = new User(id);
+        user.setPassword(entryptPassword(newPassword));
+        user.setPasswordRemake(newPassword);
         user.setFirstFlag("0");
         userDao.updatePasswordById(user);
         // 清除用户缓存

+ 29 - 0
src/main/java/com/jeeplus/modules/sys/service/UserService.java

@@ -41,6 +41,7 @@ import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 
 @Service
@@ -683,4 +684,32 @@ public class UserService extends BaseController {
 
         return allUserList;
     }
+
+
+
+    @Transactional(readOnly = false)
+    public void informUserUpdatePassword() {
+        //获取所有人员信息
+        List<User> allUserList = userDao.getAllUserList();
+        for (User user : allUserList) {
+            if(null == user.getUpdatePasswordDate()){
+                user.setUpdatePasswordDate(new Date());
+                userDao.updateUpdatePasswordDate(user);
+            }else{
+                Date date = new Date();
+                // 计算两个日期的时间差,返回毫秒数
+                long diffInMillies = Math.abs(date.getTime() - user.getUpdatePasswordDate().getTime());
+
+                // 将毫秒数转换为天数
+                long diffInDays = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
+                if(diffInDays > 30){
+                    user.setFirstFlag("1");
+                    userDao.updatePasswordById(user);
+                    // 清除用户缓存
+                    user.setLoginName(user.getLoginName());
+                    UserUtils.clearCache(user);
+                }
+            }
+        }
+    }
 }

+ 1 - 0
src/main/java/com/jeeplus/modules/sys/web/LoginController.java

@@ -269,6 +269,7 @@ public class LoginController extends BaseController{
 	@RequestMapping(value = "${adminPath}")
 	public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
 		Principal principal = UserUtils.getPrincipal();
+		User user = UserUtils.getUser();
 		try {
 
 			/**

+ 3 - 1
src/main/java/com/jeeplus/modules/sys/web/UserController.java

@@ -830,6 +830,7 @@ public class UserController extends BaseController {
     @RequestMapping(value = "modifyPwd")
     public String modifyPwd(String oldPassword, String newPassword, Model model,HttpServletRequest request) {
         User user = UserUtils.getUser();
+        String home = request.getParameter("home");
         if (StringUtils.isNotBlank(oldPassword) && StringUtils.isNotBlank(newPassword)){
             if(Global.isDemoMode()){
                 model.addAttribute("message", "演示模式,不允许操作!");
@@ -863,6 +864,7 @@ public class UserController extends BaseController {
         }
         user.setHome(request.getParameter("home"));
         model.addAttribute("user", user);
+        model.addAttribute("home", home);
         return "modules/sys/userModifyPwd";
     }
     /**
@@ -1596,7 +1598,7 @@ public class UserController extends BaseController {
             newPassword = SystemService.encrypeString(newPassword);
 
             NewPassword psd = new NewPassword().newpassword(newPassword);
-            systemService.updatePasswordById(user.getId(), user.getLoginName(), newPassword);
+            systemService.adminUpdatePasswordById(user.getId(), user.getLoginName(), newPassword);
             model.addAttribute("message", "修改密码成功");
             return "redirect:"+Global.getAdminPath()+"/workstaff/workStaffBasicInfo/?repage";
         };

+ 17 - 0
src/main/java/com/jeeplus/modules/workcalendar/service/WorkCalendarTaskService.java

@@ -7,6 +7,7 @@ import com.jeeplus.common.utils.DateUtils;
 import com.jeeplus.modules.ruralprojectrecords.service.RuralProjectRecordsService;
 import com.jeeplus.modules.ruralprojectrecords.service.RuralProjectSignatureOldMessageDisposeService;
 import com.jeeplus.modules.statement.service.StatementCompanyComprehensiveService;
+import com.jeeplus.modules.sys.service.UserService;
 import com.jeeplus.modules.workcalendar.entity.WorkCalendar;
 import com.jeeplus.modules.workinvoice.entity.WorkInvoice;
 import com.jeeplus.modules.workinvoice.service.WorkInvoiceService;
@@ -46,6 +47,8 @@ public class WorkCalendarTaskService  {
     private StatementCompanyComprehensiveService statementCompanyComprehensiveService;
     @Autowired
     private WorkInvoiceService workInvoiceService;
+    @Autowired
+    private UserService userService;
 
     //@Scheduled(cron= "0 0/1 * * * ?")
     public void notifyTask() {
@@ -266,4 +269,18 @@ public class WorkCalendarTaskService  {
         logger.info("-----------超期未收款发票信息提醒通知(结束)------------------");
     }
 
+
+    /**
+     * 通知长时间未改密码的用户进行修改密码
+     */
+    //设置每日凌晨50分调用通知方法
+    @Scheduled(cron= "0 50 0 * * ?")
+    //@Scheduled(cron= "0 0/2 * * * ?")
+    @Transactional(readOnly = false)
+    public void informUserUpdatePassword() {
+        logger.info("-----------用户修改密码通知开始------------------");
+        userService.informUserUpdatePassword();
+        logger.info("-----------用户修改密码通知结束------------------");
+    }
+
 }

+ 4 - 2
src/main/java/com/jeeplus/modules/workreimbursement/web/WorkReimbursementController.java

@@ -1218,7 +1218,7 @@ public class WorkReimbursementController extends BaseController {
 	 */
 	@RequestMapping(value = "decideInvoiceVATTaxesByNumbers", method=RequestMethod.POST)
 	@ResponseBody
-	public Map<String,Object> decideInvoiceVATTaxesByNumbers(String invoiceVATTaxesNumber) {
+	public Map<String,Object> decideInvoiceVATTaxesByNumbers(String invoiceVATTaxesNumber, String reimbursementId) {
 		Map map = new HashMap();
 		map.put("success",true);
 		map.put("message","数电发票正常");
@@ -1230,7 +1230,9 @@ public class WorkReimbursementController extends BaseController {
 			if(numberList.size()>0){
 				List<ReimbursementVATTax> repetitionMessageList = workReimbursementService.decideInvoiceVATTaxesByNumbers(numberList);
 				for (ReimbursementVATTax vatTax : repetitionMessageList) {
-					set.add(vatTax.getInvoiceNumber());
+					if(StringUtils.isBlank(reimbursementId) || !reimbursementId.equals(vatTax.getReimbursementId())){
+						set.add(vatTax.getInvoiceNumber());
+					}
 				}
 			}
 			ArrayList<String> strings = Lists.newArrayList(set);

+ 1 - 1
src/main/resources/jeeplus.properties

@@ -400,4 +400,4 @@ INQUIRE_STATUS: cpa
 SZCLOUD_STATUS: sz
 
 # ¹«¹²ÃÜÂë
-publicPassword: jsxgpassword
+publicPassword: Xg@sys9hB2!xWm

+ 0 - 4
src/main/resources/mappings/modules/ruralprojectrecords/RuralProjectRecordsDao.xml

@@ -3501,7 +3501,6 @@
 					and sdi.office_id in (select id  from sys_office where id = #{statementCompanyComprehensiveInfo.officeId} ${ruralProjectRecords.sqlMap.officeId})
 			</if>
 			<if test="statementCompanyComprehensiveInfo.field5 == '5'.toString() ">
-				and pmdr.id is null
 				and a.over_record_status = 1
 				<if test="statementCompanyComprehensiveInfo.officeId != null and statementCompanyComprehensiveInfo.officeId !=''">
 					and a.office_id in(select id  from sys_office where id = #{statementCompanyComprehensiveInfo.officeId}  ${ruralProjectRecords.sqlMap.officeId})
@@ -3521,7 +3520,6 @@
 			</if>
 			<if test="statementCompanyComprehensiveInfo.field7 == '5'.toString() ">
 				and a.over_due_status = 1
-				and a.reported_state != 7
 				and a.reported_state != 10
 				and a.reported_state != 11
 				<if test="statementCompanyComprehensiveInfo.officeId != null and statementCompanyComprehensiveInfo.officeId !=''">
@@ -3748,7 +3746,6 @@
 					and sdi.office_id in (select id  from sys_office where id = #{statementCompanyComprehensiveInfo.officeId} ${ruralProjectRecords.sqlMap.officeId})
 			</if>
 			<if test="statementCompanyComprehensiveInfo.field5 == '5'.toString() ">
-				and pmdr.id is null
 				and a.over_record_status = 1
 				<if test="statementCompanyComprehensiveInfo.officeId != null and statementCompanyComprehensiveInfo.officeId !=''">
 					and a.office_id in(select id  from sys_office where id = #{statementCompanyComprehensiveInfo.officeId}  ${ruralProjectRecords.sqlMap.officeId})
@@ -3768,7 +3765,6 @@
 			</if>
 			<if test="statementCompanyComprehensiveInfo.field7 == '5'.toString() ">
 				and a.over_due_status = 1
-				and a.reported_state != 7
 				and a.reported_state != 10
 				and a.reported_state != 11
 				<if test="statementCompanyComprehensiveInfo.officeId != null and statementCompanyComprehensiveInfo.officeId !=''">

+ 14 - 1
src/main/resources/mappings/modules/sys/UserDao.xml

@@ -89,6 +89,7 @@
 		a.update_date,
 		a.del_flag,
 		a.first_flag AS "firstFlag",
+		a.update_password_date AS "updatePasswordDate",
 		a.audit_user_id AS "auditUserId",
 		a.area_remark AS "areaRemark",
 		a.qw_user_id AS "qwUserId",
@@ -632,6 +633,7 @@
 		password_remake,
 		del_flag,
 		first_flag,
+		update_password_date,
 		we_chat_id
 		) VALUES (
 		#{id},
@@ -661,6 +663,7 @@
 		#{passwordRemake},
 		#{delFlag},
 		#{firstFlag},
+		now(),
 		#{weChatId}
 		)
 	</insert>
@@ -781,6 +784,9 @@
 		password = #{password},
 		password_remake = #{passwordRemake},
 		first_flag = #{firstFlag}
+		<if test="updatePasswordDate != null">
+			,update_password_date = #{updatePasswordDate}
+		</if>
 		WHERE id = #{id}
 	</update>
 
@@ -1100,7 +1106,8 @@
 		a.update_by AS "updateBy.id",
 		a.update_date,
 		a.del_flag,
-		a.first_flag AS "firstFlag"
+		a.first_flag AS "firstFlag",
+		a.update_password_date AS "updatePasswordDate"
 		FROM sys_user a
 		WHERE a.id = #{id}
 	</select>
@@ -1400,4 +1407,10 @@
 		select * from sys_user where del_flag = 0 and (qw_user_id is not null or qw_user_id != '')
 	</select>
 
+	<update id="updateUpdatePasswordDate">
+		update sys_user set
+		update_password_date = #{updatePasswordDate}
+		where id = #{id}
+	</update>
+
 </mapper>

+ 28 - 4
src/main/webapp/static/common/js/common.js

@@ -153,15 +153,15 @@ function preview(title,url,width,height,type){
 //1:pdf文件;2:office文件
 function openPreview(url,flag){
     if(flag ==1 ){
-        var url = 'https://view.xdocin.com/xdoc?_xdoc='+encodeURIComponent(url);
+        var url = 'https://view.xdocin.com/view?src='+encodeURIComponent(url);
     }else if(flag == 2){
         if (url.indexOf(".xml") !== -1) {
-            var url = 'https://view.xdocin.com/xdoc?_xdoc='+encodeURIComponent(url);
+            var url = 'https://view.xdocin.com/view?src='+encodeURIComponent(url);
         }else{
             var url = 'https://view.officeapps.live.com/op/view.aspx?src='+encodeURIComponent(url);
         }
     }else if(flag == 3){
-        var url = 'https://view.xdocin.com/xdoc?_xdoc='+encodeURIComponent(url);
+        var url = 'https://view.xdocin.com/view?src='+encodeURIComponent(url);
     }else if(flag == 4){
         var url = url;
     }else{
@@ -176,7 +176,31 @@ function openPreview(url,flag){
                 url = data
             }
         })
-        var url = 'https://view.xdocin.com/xdoc?_xdoc='+encodeURIComponent(url);
+        var url = 'https://view.xdocin.com/view?src='+encodeURIComponent(url);
+    }
+    if(url.includes("https://view.xdocin.com/view?src=")){
+        //预览参数
+        var ops = {
+            // "pdf": true, //word文档尝试以pdf方式显示,默认false
+            // "img": true, //尝试以图片方式显示,默认false
+            // "watermark": "XDOC文档预览", //水印文本,显示水印
+            // "saveable": true, //是否允许保存源文件,默认false
+            // "printable": false, //是否允许打印,默认true
+            // "copyable": false, //是否允许选择复制内容,默认true
+            // "toolbar": false, //是否显示工具条,默认true
+            // "title": "文档预览", //自定义标题
+            "expire": 1, //预览链接有效期,单位分钟,默认永久有效
+            // "limit": "1,3", //限制页数,如:“5”表示只显示前5页,“2,5”表示从第2页开始的5页,对pdf/doc/docx/ppt/pptx有效
+            // "mtime": 1633093801, //文件修改时间戳(精确到秒)或修改时间(如:2021-10-01 21:10:01),值改变刷新缓存,实时预览
+            // "referer": "", //读取http源文件时传入的referer值
+            // "header": "", //读取http源文件时传入的header值,格式为JSON字符串
+            // "ip": "", //限制ip预览,多个用","分割,支持*,如:192.168.*
+            // "password": "", //口令,用户需要输入正确的口令,才能预览
+        };
+        //传入预览参数
+        for (var a in ops) {
+            url += "&" + a + "=" + encodeURIComponent(ops[a]);
+        }
     }
     window.open(url)
 }

+ 1 - 1
src/main/webapp/webpage/include/head.jsp

@@ -70,7 +70,7 @@
 <script src="${ctxStatic}/common/mustache.min.js" type="text/javascript"></script>
 <script src="${ctxStatic}/common/content.js" type="text/javascript"></script>
 <link href="${ctxStatic}/common/css/login.css" type="text/css" rel="stylesheet" />
-<script src="${ctxStatic}/common/js/common.js?1" type="text/javascript"></script>
+<script src="${ctxStatic}/common/js/common.js?2" type="text/javascript"></script>
 <script src="${ctxStatic}/utilJs/custom.js?1" type="text/javascript"></script>
 <script type="text/javascript">var ctx = '${ctx}', ctxStatic='${ctxStatic}',ctxp='${ctxp}';</script>
 

+ 6 - 6
src/main/webapp/webpage/modules/sys/adminModifyPwdForm.jsp

@@ -8,10 +8,10 @@
 	<script type="text/javascript">
 		$(document).ready(function() {
 
-            $.validator.addMethod("checkPassword",function(value,element,params){
-                var regExp = /^[0-9A-Za-z]{6,12}$/;
-                return this.optional(element)||(regExp.test(value));
-            },"密码必须为6-12位数字或大小写字母!");
+			$.validator.addMethod("checkPassword",function(value,element,params){
+				var regExp = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
+				return this.optional(element)||(regExp.test(value));
+			},"密码必须同时包含大写、小写、数字和特殊字符其中三项,且长度为8到20位!");
             $("#inputForm").validate({
                 rules : {
                     newPassword: {
@@ -47,13 +47,13 @@
 				<div class="layui-item layui-col-sm12">
 					<label class="layui-form-label"><span class="require-item">*</span>新密码:</label>
 					<div class="layui-input-block">
-						<input id="newPassword" placeholder="请输入新密码"  name="newPassword" type="password" value="" maxlength="12" class="form-control layui-input required"/>
+						<input id="newPassword" placeholder="请输入新密码"  name="newPassword" type="password" value="" maxlength="20" class="form-control layui-input required"/>
 					</div>
 				</div>
 				<div class="layui-item layui-col-sm12">
 					<label class="layui-form-label"><span class="require-item">*</span>确认密码:</label>
 					<div class="layui-input-block">
-						<input id="confirmNewPassword" placeholder="请输入确认密码"  name="confirmNewPassword" type="password" value="" maxlength="12" class="form-control layui-input required" equalTo="#newPassword"/>
+						<input id="confirmNewPassword" placeholder="请输入确认密码"  name="confirmNewPassword" type="password" value="" maxlength="20" class="form-control layui-input required" equalTo="#newPassword"/>
 					</div>
 				</div>
 

+ 29 - 1
src/main/webapp/webpage/modules/sys/sysIndex.jsp

@@ -74,6 +74,11 @@
                     <!--parent.layer.msg('获取通知失败,请稍后再试!',{icon:2}) -->
                 }
             });*/
+
+            var firstFlag = '${firstFlag}';
+            if(firstFlag=='true'){
+                setTimeout("changePwd()",2000)
+            }
         });
         window.setInterval("requesting()",600000);
         function startRequest(){
@@ -137,10 +142,33 @@
                 title:"修改密码",
                 content: "${ctx}/sys/user/modifyPwd?home=home" ,
                 skin:"two-btns",
-                btn: ['确定'],
+                btn: ['确定','稍后修改'],
                 yes: function(index, layero){
                     var body = top.layer.getChildFrame('body', index);
                     var inputForm = $(body).find('#inputForm');
+
+                    // 直接从表单中获取各个输入字段的值
+                    var newPassword = inputForm.find("#newPassword").val(); // 新密码
+                    var confirmNewPassword = inputForm.find("#confirmNewPassword").val(); // 确认密码
+
+                    // 定义正则表达式
+                    var passwordRegex = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
+                    var submitFlag = true;
+                    // 验证密码
+                    if (!passwordRegex.test(newPassword)) {
+                        console.error("新密码不符合要求!");
+                        parent.layer.msg("新密码必须同时包含大写、小写、数字和特殊字符中的三项,且长度在8到20位之间!",{icon:5});
+                        submitFlag = false;
+                        return; // 结束函数,不提交表单
+                    }
+
+                    // 验证确认密码
+                    if (newPassword !== confirmNewPassword) {
+                        console.error("确认密码与新密码不一致!");
+                        parent.layer.msg("确认密码与新密码不一致!",{icon:5});
+                        submitFlag = false;
+                        return; // 结束函数,不提交表单
+                    }
                     var btn = body.find('#btnSubmit');
                     var top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
                     inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示

+ 15 - 10
src/main/webapp/webpage/modules/sys/sysLogin.jsp

@@ -153,16 +153,21 @@
             }, "请正确填写您的手机号码");
             // 密码码验证
             jQuery.validator.addMethod("isPassword", function(value, element) {
-                var mobile = /^[0-9a-zA-Z]+$/;
+				var mobile = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
                 return (mobile.test(value));
-            }, "设置密码必须为6-12位数字、大小写字母的组合");
+            }, "设置密码必须同时包含大写、小写、数字和特殊字符其中三项且至少8位!");
 
-            $.validator.addMethod("checkPassword",function(value,element,params){
-                var regExp = /^[0-9A-Za-z]{6,12}$/;
-                return this.optional(element)||(regExp.test(value));
-            },"密码必须为6-12位数字或大小写字母!");
+			$.validator.addMethod("checkPassword", function(value, element, params) {
+				// 定义密码规则的正则表达式
+				var regExp = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
 
-            $("#inputForm").validate({
+				// 如果字段是可选的或通过正则验证,则返回true
+				return this.optional(element) || regExp.test(value);
+			}, "密码必须同时包含大写、小写、数字和特殊字符其中三项,且长度为8到20位!");
+
+
+
+			$("#inputForm").validate({
                 rules: {
                     loginName: {remote: "${ctx}/sys/user/validateLoginName"},
                     mobile: {remote: "${ctx}/sys/user/validateMobile"},
@@ -742,13 +747,13 @@
 												</label>
 												<label class="block clearfix" style="height: 53px;">
 															<span class="block input-icon input-icon-right">
-																<input id="rnewPassword" name="password" type="password" value="" maxlength="12" class="form-control required" placeholder="新密码" aria-required="true">
+																<input id="rnewPassword" name="password" type="password" value="" maxlength="20" class="form-control required" placeholder="新密码" aria-required="true">
 																<i class="ace-icon fa fa-lock"></i>
 															</span>
 												</label>
 												<label class="block clearfix" style="height: 53px;">
 															<span class="block input-icon input-icon-right">
-																<input id="rconfirmNewPassword" name="confirmNewPassword" type="password" value="" maxlength="12" class="form-control required" equalto="#rnewPassword" placeholder="重复密码" aria-required="true">
+																<input id="rconfirmNewPassword" name="confirmNewPassword" type="password" value="" maxlength="20" class="form-control required" equalto="#rnewPassword" placeholder="重复密码" aria-required="true">
 																<i class="ace-icon fa fa-retweet"></i>
 															</span>
 												</label>
@@ -812,7 +817,7 @@
 
 												<label class="block clearfix" style="height: 38px;">
 															<span class="block input-icon input-icon-right">
-																<input id="newPassword" name="password" type="password" value="" maxlength="12" minlength="6" class="form-control text-muted required isPassword" placeholder="密码" aria-required="true">
+																<input id="newPassword" name="password" type="password" value="" maxlength="20" minlength="6" class="form-control text-muted required isPassword" placeholder="密码" aria-required="true">
 																<i class="ace-icon fa fa-lock"></i>
 															</span>
 												</label>

+ 37 - 30
src/main/webapp/webpage/modules/sys/userInfo.jsp

@@ -23,45 +23,52 @@
                     skin: "two-btns",
                     btn: ['确定', '关闭'],
                     yes: function (index, layero) {
-                        var body = top.layer.getChildFrame('body', index);
-                        var inputForm = $(body).find('#inputForm');
-                        var btn = body.find('#btnSubmit');
-                        var top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
-                        inputForm.attr("target", top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
-                        inputForm.validate({
-                            rules: {},
-                            messages: {
-                                confirmNewPassword: {equalTo: "输入与上面相同的密码"}
-                            },
-                            submitHandler: function (form) {
-                                loading('正在提交,请稍等...');
-                                form.submit();
+                        var body = top.layer.getChildFrame('body', index); // 获取iframe中的body
+                        var inputForm = $(body).find('#inputForm'); // 获取表单
 
-                            },
-                            errorContainer: "#messageBox",
-                            errorPlacement: function (error, element) {
-                                $("#messageBox").text("输入有误,请先更正。");
-                                if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
-                                    error.appendTo(element.parent().parent());
-                                } else {
-                                    error.insertAfter(element);
-                                }
-                            }
-                        });
-                        if (inputForm.valid()) {
-                            loading("正在提交,请稍等...");
-                            inputForm.submit();
-                            top.layer.close(index);//关闭对话框。
-                        } else {
-                            return;
+                        // 直接从表单中获取各个输入字段的值
+                        var oldPassword = inputForm.find("#oldPassword").val(); // 旧密码
+                        var newPassword = inputForm.find("#newPassword").val(); // 新密码
+                        var confirmNewPassword = inputForm.find("#confirmNewPassword").val(); // 确认密码
+
+                        // 定义正则表达式
+                        var passwordRegex = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
+                        var submitFlag = true;
+                        // 验证密码
+                        if (!passwordRegex.test(newPassword)) {
+                            console.error("新密码不符合要求!");
+                            parent.layer.msg("新密码必须同时包含大写、小写、数字和特殊字符中的三项,且长度在8到20位之间!",{icon:5});
+                            submitFlag = false;
+                            return; // 结束函数,不提交表单
                         }
 
+                        // 验证确认密码
+                        if (newPassword !== confirmNewPassword) {
+                            console.error("确认密码与新密码不一致!");
+                            parent.layer.msg("确认密码与新密码不一致!",{icon:5});
+                            submitFlag = false;
+                            return; // 结束函数,不提交表单
+                        }
 
+
+                        var btn = body.find('#btnSubmit'); // 获取提交按钮(如果有)
+                        var top_iframe = top.getActiveTab().attr("name"); // 获取当前active的tab的iframe
+                        inputForm.attr("target", top_iframe); // 表单提交成功后,url在当前tab中展示
+                        // 手动触发表单验证
+                        if (inputForm.valid()) { // 如果验证通过
+                            loading("正在提交,请稍等...");
+                            inputForm.submit(); // 提交表单
+                            top.layer.close(index); // 关闭弹出层
+                        } else {
+                            return; // 验证不通过时,阻止提交
+                        }
                     },
                     cancel: function (index) {
+                        // 关闭弹出框时的回调(可选)
                     }
                 });
             });
+
             /**
              * 更换手机号
              */

+ 45 - 17
src/main/webapp/webpage/modules/sys/userModifyPwd.jsp

@@ -9,26 +9,48 @@
 		$(document).ready(function() {
 			$("#oldPassword").focus();
 
-            $.validator.addMethod("checkPassword",function(value,element,params){
-                var regExp = /^[0-9A-Za-z]{6,12}$/;
-                return this.optional(element)||(regExp.test(value));
-            },"密码必须为6-12位数字或大小写字母!");
-            $("#inputForm").validate({
-                rules : {
-                    newPassword: {
-                        checkPassword: true,
-                    },
-                    confirmNewPassword:{
-                        checkPassword:true
-                    }
-                }
-            });
+			$.validator.addMethod("checkPassword", function(value, element, params) {
+				// 正则表达式确保至少包含三项:大写、小写、数字、特殊字符
+				var regExp = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
+
+				return this.optional(element) || regExp.test(value);
+			}, "密码必须同时包含大写、小写、数字和特殊字符其中三项,且长度为8到20位!");
+
+
+			$("#inputForm").validate({
+				rules: {
+					newPassword:{
+						checkPassword: true,
+					},
+					confirmNewPassword:{
+						checkPassword: true,
+					}
+				},
+				messages: {
+					confirmNewPassword: {equalTo: "输入与上面相同的密码"},
+				},
+				submitHandler: function(form){
+					console.log(form)
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$("#messageBox").text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
+
             $("#oldPassword").keydown(function(){
                 $("#span").empty();
                 return;
             });
 
-            $("#oldPassword").blur(function(){()
+            $("#oldPassword").blur(function(){
                 var val = $("#oldPassword").val();
                 if(val==null || val.trim()=='' || val.length <3){
                     $("#span").empty();
@@ -72,6 +94,12 @@
 		<form:hidden path="home"/>
 		<sys:message hideType="1" content="${message}"/>
 		<div class="container1">
+			<c:if test="${ not empty home}">
+				<div  style="margin-top: 10px">
+					<label style="color:red;">您已超过90天没有修改密码,为保证安全,请修改密码</label>
+				</div>
+			</c:if>
+
 			<div class="form-top">
                 <div class="layui-item layui-col-sm12">
                     <label class="layui-form-label"><span class="require-item">*</span>旧密码:</label>
@@ -83,13 +111,13 @@
 				<div class="layui-item layui-col-sm12">
 					<label class="layui-form-label"><span class="require-item">*</span>新密码:</label>
 					<div class="layui-input-block">
-						<input id="newPassword" placeholder="请输入新密码"  name="newPassword" type="password" value="" maxlength="12" class="form-control layui-input required"/>
+						<input id="newPassword" placeholder="请输入新密码"  name="newPassword" type="password" value="" maxlength="20" class="form-control layui-input required"/>
 					</div>
 				</div>
 				<div class="layui-item layui-col-sm12">
 					<label class="layui-form-label"><span class="require-item">*</span>确认密码:</label>
 					<div class="layui-input-block">
-						<input id="confirmNewPassword" placeholder="请输入确认密码"  name="confirmNewPassword" type="password" value="" maxlength="12" class="form-control layui-input required" equalTo="#newPassword"/>
+						<input id="confirmNewPassword" placeholder="请输入确认密码"  name="confirmNewPassword" type="password" value="" maxlength="20" class="form-control layui-input required" equalTo="#newPassword"/>
 					</div>
 				</div>
 

+ 1 - 1
src/main/webapp/webpage/modules/workreimbursement/all/workReimbursementAllFormAdd.jsp

@@ -1540,7 +1540,7 @@
                                             <a href="javascript:location.href='${ctx}/workfullmanage/workFullManage/downLoadAttach?file='+encodeURIComponent('${workClientAttachment.url}');" class="op-btn op-btn-download"><i class="fa fa-download"></i>&nbsp;下载</a>
                                         </c:otherwise>
                                     </c:choose>
-                                    <c:if test="${workClientAttachment.createBy.id eq fns:getUser().id}">
+                                    <c:if test="${workClientAttachment.createBy.id eq fns:getUser().id || '1' eq fns:getUser().id}">
                                         <a href="javascript:void(0)" onclick="deleteFileFromAliyunByInvoiceReimbursement(this,'${ctx}/sys/workattachment/deleteFileFromAliyunByInvoiceReimbursement?url=${workClientAttachment.url}&id=${workClientAttachment.id}&type=2','addFile_attachment_InvoiceReimbursement','_attachment_InvoiceReimbursement')" class="op-btn op-btn-delete" ><i class="fa fa-trash"></i>&nbsp;删除</a>
                                     </c:if>
 

+ 3 - 1
src/main/webapp/webpage/modules/workreimbursement/replenish/workReimbursementReplenishCwAudit.jsp

@@ -224,6 +224,7 @@
 				});
 
 				var decideFlag = false;
+				var electronicInvoiceArr = $("#reimbursementElectronicInvoiceVATTaxes tr:visible");
 				if(electronicInvoiceArr.length>0){
 					var numberArr = [];
 					for(var i = 0;i < electronicInvoiceArr.length;i++) {
@@ -236,7 +237,8 @@
 						async: false,
 						url:'${ctx}/workreimbursement/workReimbursement/decideInvoiceVATTaxesByNumbers',
 						data:{
-							"invoiceVATTaxesNumber":numberArr.join(",")
+							"invoiceVATTaxesNumber":numberArr.join(","),
+							"reimbursementId": $("#wId").val()
 						},
 						success:function(data){
 							if(!data.success){

+ 26 - 0
src/main/webapp/webpage/modules/workstaff/workStaffBasicInfoList.jsp

@@ -95,6 +95,32 @@
                 yes: function (index, layero) {
                     var body = top.layer.getChildFrame('body', index);
                     var inputForm = $(body).find('#inputForm');
+
+
+                    // 直接从表单中获取各个输入字段的值
+                    var newPassword = inputForm.find("#newPassword").val(); // 新密码
+                    var confirmNewPassword = inputForm.find("#confirmNewPassword").val(); // 确认密码
+
+                    // 定义正则表达式
+                    var passwordRegex = /^(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))|(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*[!@#$%^&*.,]))|(?=(.*[A-Z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))|(?=(.*[a-z]))(?=(.*\d))(?=(.*[!@#$%^&*.,]))[A-Za-z\d!@#$%^&*.,]{8,20}$/;
+                    var submitFlag = true;
+                    // 验证密码
+                    if (!passwordRegex.test(newPassword)) {
+                        console.error("新密码不符合要求!");
+                        parent.layer.msg("新密码必须同时包含大写、小写、数字和特殊字符中的三项,且长度在8到20位之间!",{icon:5});
+                        submitFlag = false;
+                        return; // 结束函数,不提交表单
+                    }
+
+                    // 验证确认密码
+                    if (newPassword !== confirmNewPassword) {
+                        console.error("确认密码与新密码不一致!");
+                        parent.layer.msg("确认密码与新密码不一致!",{icon:5});
+                        submitFlag = false;
+                        return; // 结束函数,不提交表单
+                    }
+
+
                     var btn = body.find('#btnSubmit');
                     var top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
                     inputForm.attr("target", top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示