Compare commits

15 Commits

Author SHA1 Message Date
12447a547c 人脸/车闸接口整合 2026-04-29 15:51:02 +08:00
e5c3849948 bug 2026-04-29 00:19:06 +08:00
8cc0555d1f bug 2026-04-27 21:30:48 +08:00
2ca6153cda bug 2026-04-21 23:45:48 +08:00
6738104534 bug 2026-04-16 01:13:03 +08:00
e5da30098f Merge branch 'deng' of http://101.43.41.9:13000/xzzn/SIPAIIS_WMS_JSSW into deng 2026-04-14 20:13:49 +08:00
65c2a978b8 feat(main_JS_Company): 重构主配置与企业模块数据加载逻辑 2026-04-14 20:13:47 +08:00
80fa5872fd bug 2026-04-13 21:37:01 +08:00
5c576ddfcb bug 2026-04-09 14:16:18 +08:00
f89ab0f90d bug 2026-04-09 09:09:00 +08:00
78ec2cbe85 Merge branch 'deng' into deng-release 2026-04-08 19:17:05 +08:00
6c08c4fd1b bug 2026-04-08 19:15:15 +08:00
3c9ba8a7f5 feat(process): 优化工艺列表初始化与测点值异步获取 2026-04-08 01:11:01 +08:00
abdd3b7add Merge branch 'deng' into deng-release 2026-04-05 23:21:52 +08:00
6d5c8bfd65 fix(file): 优化文件上传及预览逻辑,完善当前用户信息设置 2026-04-05 22:36:07 +08:00
58 changed files with 2664 additions and 1439 deletions

24
pom.xml
View File

@ -21,6 +21,12 @@
<!-- 数据<E695B0>?-->
</properties>
<dependencies>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.4.0</version>
</dependency>
<!-- spring核心<E6A0B8>?-->
<dependency>
<groupId>org.springframework</groupId>
@ -781,11 +787,11 @@
<version>1.6.1</version>
</dependency>
<!-- jna -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>net.java.dev.jna</groupId>-->
<!-- <artifactId>jna</artifactId>-->
<!-- <version>1.0</version>-->
<!-- </dependency>-->
<!-- jna examples -->
<dependency>
<groupId>net.java.dev.jna</groupId>
@ -796,6 +802,14 @@
<build>
<finalName>TGLW</finalName>
<resources>
<!-- <resource>-->
<!-- <directory>libs/win64</directory>-->
<!-- <targetPath>win64</targetPath>-->
<!-- <includes>-->
<!-- <include>*.dll</include>-->
<!-- </includes>-->
<!-- <filtering>false</filtering>-->
<!-- </resource>-->
<resource>
<directory>src/main/java</directory>
<includes>

View File

@ -1,9 +0,0 @@
package com.sipai.activiti;
public class Test {
public static void main(String[] args) {
int a = 3;
int b = 3;
System.out.println(a % b);
}
}

View File

@ -492,24 +492,24 @@ public class ActivitiController {
}
}
// 当 passFlag=false 过滤后返回空列表(即未识别到退回路径),则作为备用方案返回全部路径
if (list.isEmpty() && !pFlag && totalCount > 0) {
// 当过滤后返回空列表,则作为备用方案返回全部路径
if (list.isEmpty() && totalCount > 0) {
list = workflowProcessDefinitionService.getNextWorkTasks(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
}
JSONArray jsonArray = new JSONArray();
if (list != null && list.size() > 0) {
for (WorkTask workTask : list) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", workTask.getRouteNum());
jsonObject.put("text", workTask.getName());
jsonObject.put("resourceId", workTask.getId());
jsonObject.put("modelKEY", workTask.getPd_key());
jsonArray.add(jsonObject);
}
}
model.addAttribute("result", jsonArray.toString());
}
JSONArray jsonArray = new JSONArray();
if (list != null && list.size() > 0) {
for (WorkTask workTask : list) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", workTask.getRouteNum());
jsonObject.put("text", workTask.getName());
jsonObject.put("resourceId", workTask.getId());
jsonObject.put("modelKEY", workTask.getPd_key());
jsonArray.add(jsonObject);
}
}
model.addAttribute("result", jsonArray.toString());
return "result";
}

View File

@ -1,7 +1,11 @@
package com.sipai.controller.administration;
import com.sipai.tools.HttpUtil;
import com.sipai.tools.DeviceAccessHttpUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@ -9,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
@ -17,11 +22,19 @@ import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;
@Controller
@RequestMapping("/administration/attendance")
public class AttendanceController {
private static final Logger LOG = LoggerFactory.getLogger(AttendanceController.class);
private static final DateTimeFormatter DAY_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final int DEFAULT_FETCH_DAYS = 30;
private static final int DEFAULT_REMOTE_PAGE_SIZE = 200;
private static final int MAX_REMOTE_PAGES_PER_DAY = 100;
private static final String DEFAULT_API_URL = "http://127.0.0.1:8090/dh-netsdk/attendance/getDailyRecordList";
private static final Properties ATTENDANCE_PROPS = loadAttendanceProps();
@RequestMapping("/showList.do")
public String showList(HttpServletRequest request, Model model) {
@ -42,7 +55,8 @@ public class AttendanceController {
LocalDate startDate = parseDay(start);
LocalDate endDate = parseDay(end);
List<Map<String, Object>> allRows = buildMockRows();
LocalDate[] range = resolveRange(startDate, endDate);
List<Map<String, Object>> allRows = loadRowsFromRemote(request, range[0], range[1]);
List<Map<String, Object>> filtered = new ArrayList<Map<String, Object>>();
for (Map<String, Object> item : allRows) {
@ -64,10 +78,10 @@ public class AttendanceController {
if (!status.isEmpty() && !status.equals(st)) {
continue;
}
if (startDate != null && day != null && day.isBefore(startDate)) {
if (startDate != null && (day == null || day.isBefore(startDate))) {
continue;
}
if (endDate != null && day != null && day.isAfter(endDate)) {
if (endDate != null && (day == null || day.isAfter(endDate))) {
continue;
}
filtered.add(item);
@ -86,6 +100,239 @@ public class AttendanceController {
return new ModelAndView("result");
}
private List<Map<String, Object>> loadRowsFromRemote(HttpServletRequest request, LocalDate startDate, LocalDate endDate) {
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
if (startDate == null || endDate == null) {
return rows;
}
int pageSize = getIntProp("attendance.api.pageSize", DEFAULT_REMOTE_PAGE_SIZE);
String url = getProp("attendance.api.url", DEFAULT_API_URL);
Map<String, String> headers = buildDhHeaders(request);
LocalDate day = startDate;
while (!day.isAfter(endDate)) {
for (int pageNum = 1; pageNum <= MAX_REMOTE_PAGES_PER_DAY; pageNum++) {
com.alibaba.fastjson.JSONObject req = new com.alibaba.fastjson.JSONObject();
req.put("day", DAY_FMT.format(day));
req.put("pageNum", pageNum);
req.put("pageSize", pageSize);
String respText;
try {
respText = HttpUtil.sendPost(url, req, headers);
} catch (Exception ex) {
LOG.error("Attendance request failed, day={}, pageNum={}", day, pageNum, ex);
break;
}
int fetched = appendRowsFromResponse(rows, respText, day, pageNum);
if (fetched <= 0 || fetched < pageSize) {
break;
}
}
day = day.plusDays(1);
}
return rows;
}
private int appendRowsFromResponse(List<Map<String, Object>> rows, String respText, LocalDate day, int pageNum) {
if (respText == null || respText.trim().isEmpty()) {
LOG.warn("Attendance response empty, day={}, pageNum={}", day, pageNum);
return 0;
}
JSONObject resp;
try {
resp = JSONObject.fromObject(respText);
} catch (Exception ex) {
LOG.error("Attendance response parse error, day={}, pageNum={}, body={}", day, pageNum, shorten(respText), ex);
return 0;
}
boolean success = "true".equalsIgnoreCase(String.valueOf(resp.opt("success")));
if (!success) {
LOG.warn("Attendance response unsuccessful, day={}, pageNum={}, message={}", day, pageNum, resp.optString("message"));
return 0;
}
JSONArray data = resp.optJSONArray("data");
if (data == null || data.isEmpty()) {
return 0;
}
for (int i = 0; i < data.size(); i++) {
Object item = data.get(i);
JSONObject dto = item instanceof JSONObject ? (JSONObject) item : JSONObject.fromObject(item);
rows.add(mapRemoteRecord(dto));
}
return data.size();
}
private static Map<String, String> buildDhHeaders(HttpServletRequest request) {
String ip = getProp("attendance.api.deviceIp", "192.168.1.108");
String user = getProp("attendance.api.deviceUser", "admin");
String port = getProp("attendance.api.devicePort", "37777");
// String ts = safe(request.getParameter("dhTs"));
// if (ts.isEmpty()) {
// ts = String.valueOf(System.nanoTime());
// }
String ts = nextUniqueTimestamp();
String plainPwd = getProp("attendance.api.devicePassword", "");
if (plainPwd.isEmpty()) {
LOG.warn("attendance.api.devicePassword is empty, DH attendance call may fail auth");
}
Map<String, String> headers;
try {
headers = DeviceAccessHttpUtil.buildDeviceHeaders(ip, user, plainPwd, ts, port);
} catch (Exception ex) {
throw new IllegalStateException("Build DH device headers failed", ex);
}
headers.put("Content-Type", "application/json");
return headers;
}
private static Map<String, Object> mapRemoteRecord(JSONObject dto) {
String eventTime = dto.optString("eventTime");
String attendanceDate = extractDate(eventTime);
String checkInTime = extractTime(eventTime);
Map<String, Object> row = new LinkedHashMap<String, Object>();
row.put("id", buildRowId(dto, attendanceDate, checkInTime));
row.put("employeeNo", firstNonEmpty(dto.optString("userId"), dto.optString("cardNo")));
row.put("employeeName", firstNonEmpty(dto.optString("userName"), dto.optString("userId"), "--"));
row.put("deptName", firstNonEmpty(dto.optString("deptName"), "--"));
row.put("attendanceDate", attendanceDate);
row.put("checkInTime", checkInTime);
row.put("checkOutTime", "--");
row.put("workHours", "--");
row.put("status", resolveStatus(dto));
row.put("source", "第三方接口(DH)");
// Keep raw fields for troubleshooting and later expansion.
row.put("cardNo", dto.optString("cardNo"));
row.put("channel", dto.optInt("channel"));
row.put("openMethod", dto.optInt("openMethod"));
row.put("result", dto.optInt("result"));
row.put("errCode", dto.optInt("errCode"));
row.put("attendanceState", dto.optInt("attendanceState"));
row.put("attendanceStateText", dto.optString("attendanceStateText"));
return row;
}
private static String resolveStatus(JSONObject dto) {
String text = safe(dto.optString("attendanceStateText"));
if (!text.isEmpty()) {
return text;
}
int state = dto.optInt("attendanceState", -1);
if (state == 0) {
return "正常";
}
if (state == 1) {
return "迟到";
}
if (state == 2) {
return "早退";
}
if (state == 3) {
return "缺卡";
}
return "未知";
}
private static String buildRowId(JSONObject dto, String date, String time) {
String uid = safe(dto.optString("userId"));
String idx = String.valueOf(dto.optInt("index", 0));
return firstNonEmpty(uid, "U") + "-" + safe(date) + "-" + safe(time) + "-" + idx;
}
private static String firstNonEmpty(String... values) {
if (values == null) {
return "";
}
for (String v : values) {
if (v != null && !v.trim().isEmpty()) {
return v.trim();
}
}
return "";
}
private static String extractDate(String eventTime) {
String v = safe(eventTime);
if (v.length() >= 10) {
return v.substring(0, 10);
}
return "";
}
private static String extractTime(String eventTime) {
String v = safe(eventTime);
if (v.contains("T") && v.length() >= 19) {
return v.substring(11, 19);
}
int blank = v.indexOf(' ');
if (blank >= 0 && v.length() >= blank + 9) {
return v.substring(blank + 1, blank + 9);
}
return v;
}
private static LocalDate[] resolveRange(LocalDate startDate, LocalDate endDate) {
LocalDate now = LocalDate.now();
LocalDate start = startDate;
LocalDate end = endDate;
if (start == null && end == null) {
// No date filter from UI: fetch only current day.
start = now;
end = now;
} else if (start == null) {
// Only end date provided: query that single day.
start = end;
} else if (end == null) {
// Only start date provided: query that single day.
end = start;
}
if (start.isAfter(end)) {
LocalDate t = start;
start = end;
end = t;
}
return new LocalDate[]{start, end};
}
private static Properties loadAttendanceProps() {
Properties p = new Properties();
try (InputStream in = AttendanceController.class.getClassLoader().getResourceAsStream("thirdRequest.properties")) {
if (in != null) {
p.load(in);
}
} catch (Exception ex) {
LOG.warn("Load thirdRequest.properties failed", ex);
}
return p;
}
private static String getProp(String key, String defaultValue) {
String v = ATTENDANCE_PROPS.getProperty(key);
return v == null || v.trim().isEmpty() ? defaultValue : v.trim();
}
private static int getIntProp(String key, int defaultValue) {
String v = getProp(key, String.valueOf(defaultValue));
try {
return Integer.parseInt(v);
} catch (Exception ex) {
return defaultValue;
}
}
private static String shorten(String text) {
if (text == null) {
return "";
}
String oneLine = text.replace('\n', ' ').replace('\r', ' ');
return oneLine.length() > 400 ? oneLine.substring(0, 400) + "..." : oneLine;
}
private static void sortRows(List<Map<String, Object>> rows, String sort, String order) {
final boolean asc = "asc".equalsIgnoreCase(order);
final String sortField = (sort == null || sort.trim().isEmpty() || "id".equals(sort)) ? "attendanceDate" : sort;
@ -117,61 +364,6 @@ public class AttendanceController {
});
}
private static List<Map<String, Object>> buildMockRows() {
String[][] employees = {
{"E0001", "张三", "生产部"},
{"E0002", "李四", "设备部"},
{"E0003", "王五", "品控部"},
{"E0004", "赵六", "仓储部"},
{"E0005", "钱七", "行政部"}
};
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
LocalDate today = LocalDate.now();
int idSeq = 1;
for (int d = 0; d < 45; d++) {
LocalDate day = today.minusDays(d);
String dayStr = DAY_FMT.format(day);
for (int i = 0; i < employees.length; i++) {
String[] emp = employees[i];
int flag = d + i;
String status = "正常";
String checkIn = "08:55";
String checkOut = "18:05";
String workHours = "8.5";
if (flag % 19 == 0) {
status = "缺卡";
checkOut = "--";
workHours = "4.2";
} else if (flag % 11 == 0) {
status = "迟到";
checkIn = "09:" + (10 + (flag % 20));
workHours = "7.8";
} else if (flag % 13 == 0) {
status = "早退";
checkOut = "17:" + (20 + (flag % 30));
workHours = "7.1";
}
Map<String, Object> row = new LinkedHashMap<String, Object>();
row.put("id", "mock-" + idSeq++);
row.put("employeeNo", emp[0]);
row.put("employeeName", emp[1]);
row.put("deptName", emp[2]);
row.put("attendanceDate", dayStr);
row.put("checkInTime", checkIn);
row.put("checkOutTime", checkOut);
row.put("workHours", workHours);
row.put("status", status);
row.put("source", "第三方接口(MOCK)");
rows.add(row);
}
}
return rows;
}
private static String safe(String s) {
return s == null ? "" : s.trim();
@ -191,4 +383,17 @@ public class AttendanceController {
return null;
}
}
private static final AtomicLong TS_SEQ = new AtomicLong();
private static String nextUniqueTimestamp() {
long now = System.nanoTime();
while (true) {
long prev = TS_SEQ.get();
long next = now > prev ? now : prev + 1;
if (TS_SEQ.compareAndSet(prev, next)) {
return String.valueOf(next);
}
}
}
}

View File

@ -2217,12 +2217,27 @@ public class EquipmentCardController {
HttpServletResponse response, Model model) throws IOException {
String wherestr = " where 1=1 ";
String unitId = request.getParameter("unitId");
if (unitId == null || unitId.isEmpty()) {
unitId = request.getParameter("companyId");
}
String search_name = request.getParameter("search_name");
if (search_name == null || search_name.trim().isEmpty()) {
search_name = request.getParameter("equipmentName");
}
String processSectionId = request.getParameter("processSectionId");
if (processSectionId == null || processSectionId.trim().isEmpty() || "undefined".equals(processSectionId)) {
processSectionId = request.getParameter("processSection");
}
String equipmentClassId = request.getParameter("equipmentClassId");
if (equipmentClassId == null || equipmentClassId.trim().isEmpty() || "undefined".equals(equipmentClassId)) {
equipmentClassId = request.getParameter("search_pid1");
}
String equipmentLevel = request.getParameter("equipmentLevel");
String equipmentClassCode = request.getParameter("equipmentClassCode");//类似竹一的计量表 该页面仅显示一种设备类型的
String ids = request.getParameter("ids");//页面勾选的设备id
if (ids == null || ids.trim().isEmpty()) {
ids = request.getParameter("equipmentIds");
}
if (unitId != null && !unitId.isEmpty()) {
//获取公司下所有子节点
@ -2272,6 +2287,26 @@ public class EquipmentCardController {
// System.out.println(wherestr);
if (ids != null && !ids.trim().isEmpty()) {
// 兼容前端可能携带的首尾逗号与空白,确保仅导出选中设备。
String[] idArr = ids.split(",");
StringBuilder selectedIds = new StringBuilder();
for (String id : idArr) {
if (id != null) {
String trimmedId = id.trim();
if (!trimmedId.isEmpty()) {
if (selectedIds.length() > 0) {
selectedIds.append("','");
}
selectedIds.append(trimmedId);
}
}
}
if (selectedIds.length() > 0) {
wherestr += " and id in ('" + selectedIds + "') ";
}
}
List<EquipmentCard> equipmentCards = this.equipmentCardService.selectListByWhere(wherestr);
//导出文件到指定目录,兼容Linux
this.equipmentCardService.downloadEquipmentExcel(response, equipmentCards);

View File

@ -1,6 +1,11 @@
package com.sipai.controller.jsyw;
import com.sipai.tools.DeviceAccessHttpUtil;
import com.sipai.tools.HttpUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@ -8,15 +13,27 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;
@Controller
@RequestMapping("/jsyw/vehicleGate")
public class VehicleGateController {
private static final Logger LOG = LoggerFactory.getLogger(VehicleGateController.class);
private static final DateTimeFormatter DAY_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final int DEFAULT_REMOTE_PAGE_SIZE = 200;
private static final int MAX_REMOTE_PAGES_PER_DAY = 100;
private static final String DEFAULT_API_URL = "http://127.0.0.1:8090/dh-netsdk/vehicleGate/getDailyRecognizedVehicleList";
private static final Properties VEHICLE_GATE_PROPS = loadVehicleGateProps();
private static final AtomicLong TS_SEQ = new AtomicLong();
@RequestMapping("/showList.do")
public String showList(HttpServletRequest request, Model model) {
@ -31,14 +48,18 @@ public class VehicleGateController {
String passDate = safeStr(request.getParameter("passDate"));
String direction = safeStr(request.getParameter("direction"));
String status = safeStr(request.getParameter("status"));
LocalDate queryDay = parseDay(passDate);
if (queryDay == null) {
queryDay = LocalDate.now();
}
List<Map<String, Object>> mockRows = buildMockRows();
List<Map<String, Object>> remoteRows = loadRowsFromRemote(queryDay, plateNo);
List<Map<String, Object>> filteredRows = new ArrayList<Map<String, Object>>();
int inCount = 0;
int outCount = 0;
int abnormalCount = 0;
for (Map<String, Object> item : mockRows) {
for (Map<String, Object> item : remoteRows) {
String itemPlateNo = safeStr(item.get("plateNo")).toUpperCase(Locale.ROOT);
String itemPassTime = safeStr(item.get("passTime"));
String itemDirection = safeStr(item.get("direction"));
@ -69,46 +90,209 @@ public class VehicleGateController {
pageRows = filteredRows.subList(pageStart, pageEnd);
}
JSONArray rowsJson = JSONArray.fromObject(pageRows);
String result = "{"
+ "\"total\":" + total + ","
+ "\"rows\":" + rowsJson + ","
+ "\"summaryInCount\":" + inCount + ","
+ "\"summaryOutCount\":" + outCount + ","
+ "\"summaryInsideCount\":" + (inCount - outCount) + ","
+ "\"summaryAbnormalCount\":" + abnormalCount
+ "}";
model.addAttribute("result", result);
JSONObject result = new JSONObject();
result.put("total", total);
result.put("rows", JSONArray.fromObject(pageRows));
result.put("summaryInCount", inCount);
result.put("summaryOutCount", outCount);
result.put("summaryInsideCount", inCount - outCount);
result.put("summaryAbnormalCount", abnormalCount);
model.addAttribute("result", result.toString());
return new ModelAndView("result");
}
private String safeStr(Object value) {
return value == null ? "" : String.valueOf(value).trim();
}
private List<Map<String, Object>> buildMockRows() {
private List<Map<String, Object>> loadRowsFromRemote(LocalDate day, String plateNo) {
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
rows.add(buildRow("鲁A12345", "IN", "2026-03-03 08:12:21", "东门1号闸", "张三", "NORMAL", "自动识别放行"));
rows.add(buildRow("鲁B66K88", "OUT", "2026-03-03 08:18:46", "东门1号闸", "李四", "NORMAL", "自动识别放行"));
rows.add(buildRow("鲁C99871", "IN", "2026-03-03 08:27:19", "南门2号闸", "王五", "ABNORMAL", "车牌识别异常,人工放行"));
rows.add(buildRow("鲁A77889", "IN", "2026-03-03 09:04:52", "北门1号闸", "赵六", "NORMAL", "自动识别放行"));
rows.add(buildRow("鲁D22319", "OUT", "2026-03-03 09:19:11", "南门2号闸", "钱七", "NORMAL", "自动识别放行"));
rows.add(buildRow("鲁E55120", "IN", "2026-03-03 10:03:35", "西门1号闸", "孙八", "NORMAL", "访客车辆"));
rows.add(buildRow("鲁F90111", "OUT", "2026-03-03 10:16:05", "北门1号闸", "周九", "ABNORMAL", "未登记离场,值班确认"));
rows.add(buildRow("鲁A0P365", "IN", "2026-03-03 10:42:30", "东门1号闸", "吴十", "NORMAL", "自动识别放行"));
int pageSize = getIntProp("vehicleGate.api.pageSize", DEFAULT_REMOTE_PAGE_SIZE);
String url = getProp("vehicleGate.api.url", DEFAULT_API_URL);
for (int pageNum = 1; pageNum <= MAX_REMOTE_PAGES_PER_DAY; pageNum++) {
com.alibaba.fastjson.JSONObject req = new com.alibaba.fastjson.JSONObject();
req.put("day", DAY_FMT.format(day));
req.put("plateNumber", plateNo);
req.put("pageNum", pageNum);
req.put("pageSize", pageSize);
String ts = nextUniqueTimestamp();
Map<String, String> headers = buildDhHeaders(ts);
String respText;
try {
respText = HttpUtil.sendPost(url, req, headers);
} catch (Exception ex) {
LOG.error("VehicleGate request failed, day={}, pageNum={}", day, pageNum, ex);
break;
}
int fetched = appendRowsFromResponse(rows, respText, day, pageNum);
if (fetched <= 0 || fetched < pageSize) {
break;
}
}
return rows;
}
private Map<String, Object> buildRow(String plateNo, String direction, String passTime, String gateName,
String driverName, String status, String note) {
Map<String, Object> row = new HashMap<String, Object>();
row.put("plateNo", plateNo);
row.put("direction", direction);
row.put("passTime", passTime);
row.put("gateName", gateName);
row.put("driverName", driverName);
row.put("status", status);
row.put("note", note);
private int appendRowsFromResponse(List<Map<String, Object>> rows, String respText, LocalDate day, int pageNum) {
if (respText == null || respText.trim().isEmpty()) {
LOG.warn("VehicleGate response empty, day={}, pageNum={}", day, pageNum);
return 0;
}
JSONObject resp;
try {
resp = JSONObject.fromObject(respText);
} catch (Exception ex) {
LOG.error("VehicleGate response parse error, day={}, pageNum={}, body={}", day, pageNum, shorten(respText), ex);
return 0;
}
boolean success = "true".equalsIgnoreCase(String.valueOf(resp.opt("success")));
if (!success) {
LOG.warn("VehicleGate response unsuccessful, day={}, pageNum={}, message={}", day, pageNum, resp.optString("message"));
return 0;
}
JSONArray data = resp.optJSONArray("data");
if (data == null || data.isEmpty()) {
return 0;
}
for (int i = 0; i < data.size(); i++) {
Object item = data.get(i);
JSONObject dto = item instanceof JSONObject ? (JSONObject) item : JSONObject.fromObject(item);
rows.add(mapRemoteRecord(dto));
}
return data.size();
}
private static Map<String, String> buildDhHeaders(String ts) {
String ip = getProp("vehicleGate.api.deviceIp", "192.168.1.108");
String user = getProp("vehicleGate.api.deviceUser", "admin");
String port = getProp("vehicleGate.api.devicePort", "37777");
String plainPwd = getProp("vehicleGate.api.devicePassword", "");
if (plainPwd.isEmpty()) {
LOG.warn("vehicleGate.api.devicePassword is empty, vehicle gate call may fail auth");
}
try {
Map<String, String> headers = DeviceAccessHttpUtil.buildDeviceHeaders(ip, user, plainPwd, ts, port);
headers.put("Content-Type", "application/json");
return headers;
} catch (Exception ex) {
throw new IllegalStateException("Build vehicle gate headers failed", ex);
}
}
private static String nextUniqueTimestamp() {
long now = System.nanoTime();
while (true) {
long prev = TS_SEQ.get();
long next = now > prev ? now : prev + 1;
if (TS_SEQ.compareAndSet(prev, next)) {
return String.valueOf(next);
}
}
}
private static Map<String, Object> mapRemoteRecord(JSONObject dto) {
String eventTime = safeStr(dto.optString("eventTime"));
int channel = dto.optInt("channel", -1);
int lane = dto.optInt("lane", -1);
Map<String, Object> row = new LinkedHashMap<String, Object>();
row.put("plateNo", safeStr(dto.optString("plateNumber")));
row.put("direction", resolveDirection(dto));
row.put("passTime", eventTime);
row.put("gateName", buildGateName(channel, lane));
row.put("driverName", "--");
row.put("status", resolveStatus(dto));
row.put("note", firstNonEmpty(safeStr(dto.optString("allowStatusText")), "通道" + channel + " 车道" + lane));
return row;
}
private static String resolveDirection(JSONObject dto) {
String text = safeStr(dto.optString("allowStatusText"));
if (text.contains("")) {
return "OUT";
}
if (text.contains("") || text.contains("")) {
return "IN";
}
int lane = dto.optInt("lane", -1);
if (lane > 0 && lane % 2 == 0) {
return "OUT";
}
return "IN";
}
private static String resolveStatus(JSONObject dto) {
int allow = dto.optInt("allowStatus", -1);
if (allow == 1) {
return "NORMAL";
}
return "ABNORMAL";
}
private static String buildGateName(int channel, int lane) {
if (channel < 0 && lane < 0) {
return "--";
}
return "通道" + channel + "-车道" + lane;
}
private static String safeStr(Object value) {
return value == null ? "" : String.valueOf(value).trim();
}
private static String firstNonEmpty(String... values) {
if (values == null) {
return "";
}
for (String value : values) {
if (value != null && !value.trim().isEmpty()) {
return value.trim();
}
}
return "";
}
private static LocalDate parseDay(String day) {
if (day == null || day.trim().isEmpty()) {
return null;
}
try {
return LocalDate.parse(day.trim(), DAY_FMT);
} catch (Exception ex) {
return null;
}
}
private static Properties loadVehicleGateProps() {
Properties p = new Properties();
try (InputStream in = VehicleGateController.class.getClassLoader().getResourceAsStream("thirdRequest.properties")) {
if (in != null) {
p.load(in);
}
} catch (Exception ex) {
LOG.warn("Load thirdRequest.properties failed", ex);
}
return p;
}
private static String getProp(String key, String defaultValue) {
String v = VEHICLE_GATE_PROPS.getProperty(key);
return v == null || v.trim().isEmpty() ? defaultValue : v.trim();
}
private static int getIntProp(String key, int defaultValue) {
String v = getProp(key, String.valueOf(defaultValue));
try {
return Integer.parseInt(v);
} catch (Exception ex) {
return defaultValue;
}
}
private static String shorten(String text) {
if (text == null) {
return "";
}
String oneLine = text.replace('\n', ' ').replace('\r', ' ');
return oneLine.length() > 400 ? oneLine.substring(0, 400) + "..." : oneLine;
}
}

View File

@ -104,7 +104,7 @@ public class KpiPlanController {
if (StringUtils.isNotBlank(positonTypeList)) {
wherestr += " and j.level_type = " + positonTypeList;
}
wherestr += "and p.create_user_id ='" + id + "'";
wherestr += " and p.create_user_id ='" + id + "'";
PageHelper.startPage(page, rows);
List<KpiPlan> list = kpiPlanService.selectListByWhere(wherestr + orderstr);
@ -387,7 +387,8 @@ public class KpiPlanController {
@RequestMapping("/export.do")
public void export(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "periodTypeName", required = false) String periodTypeList,
@RequestParam(value = "positionType", required = false) String positonTypeList) throws IOException {
@RequestParam(value = "positionType", required = false) String positonTypeList,
@RequestParam(value = "ids", required = false) String ids) throws IOException {
// 摘自列表查询接口 start
User cu = (User) request.getSession().getAttribute("cu");
String id = cu.getId();
@ -399,6 +400,10 @@ public class KpiPlanController {
if (StringUtils.isNotBlank(positonTypeList) && !"null".equals(positonTypeList)) {
wherestr += " and j.level_type = " + positonTypeList;
}
if (StringUtils.isNotBlank(ids)) {
String idstr = ids.replace("'", "").replace(",", "','");
wherestr += " and p.id in ('" + idstr + "')";
}
wherestr += "and p.create_user_id ='" + id + "'";
List<KpiPlan> list = kpiPlanService.selectListByWhere(wherestr + orderstr);

View File

@ -404,14 +404,20 @@ public class RptCreateController {
@RequestMapping("/doaddMore.do")
public String doaddMore(HttpServletRequest request, Model model) {
User cu = (User) request.getSession().getAttribute("cu");
if (cu == null) {
model.addAttribute("result", "{\"res\":\"用户未登录\",\"msg\":\"用户未登录\"}");
return "result";
}
request.setAttribute("userId", cu.getId());
request.setAttribute("userName", cu.getCaption());
request.setAttribute("id", CommUtil.getUUID());
String rpttype = request.getParameter("rpttype");
if (RptInfoSet.RptType_Day.equals(rpttype)) {
request.setAttribute("dateD", CommUtil.nowDate().substring(0, 10));
} else if (RptInfoSet.RptType_Month.equals(rpttype) || RptInfoSet.RptType_Quarterly.equals(rpttype) || RptInfoSet.RptType_HalfYear.equals(rpttype)) {
request.setAttribute("dateD", CommUtil.nowDate().substring(0, 7));
} else if (RptInfoSet.RptType_Month.equals(rpttype) || RptInfoSet.RptType_HalfYear.equals(rpttype)) {
request.setAttribute("dateM", CommUtil.nowDate().substring(0, 7));
} else if (RptInfoSet.RptType_Quarterly.equals(rpttype)) {
request.setAttribute("dateQ", CommUtil.nowDate().substring(0, 7));
} else if (RptInfoSet.RptType_Year.equals(rpttype)) {
request.setAttribute("dateY", CommUtil.nowDate().substring(0, 4));
}
@ -723,7 +729,14 @@ public class RptCreateController {
RptCreate rptCreate = this.rptCreateService.selectById(id);
if (rptCreate != null) {//报表生成
try {
String base = this.rptCreateService.convertExceltoHtml(CommUtil.fixRptCreateFileName(rptCreate.getRptname() + rptCreate.getId()), sheetname, id, layerType, FileNameSpaceEnum.RptCreateFile.getNameSpace());
// 优先使用数据库中存储的文件路径,如果没有则构造路径(兼容旧数据)
String filePath;
if (rptCreate.getAbspath() != null && !rptCreate.getAbspath().isEmpty()) {
filePath = rptCreate.getAbspath();
} else {
filePath = CommUtil.fixRptCreateFileName(rptCreate.getRptname() + rptCreate.getId());
}
String base = this.rptCreateService.convertExceltoHtml(filePath, sheetname, id, layerType, FileNameSpaceEnum.RptCreateFile.getNameSpace());
//截取掉sheet名 目前只能先截取h2
String result = subRangeString(base, "<h2>", "</h2>");
result = result.replaceAll("<table class=\"t1\">", "<table class=\"t1\" id=\"t1\">");

View File

@ -222,18 +222,50 @@ public class SafetyCertificateController {
@RequestMapping("/deletes.do")
@Transactional(rollbackFor = Exception.class)
public String delete(HttpServletRequest request, Model model, String[] ids) throws IOException {
public String delete(HttpServletRequest request, Model model,
@RequestParam(value = "ids", required = false) String ids,
@RequestParam(value = "staffIds", required = false) String staffIds) throws IOException {
int result = 0;
for (String id : ids) {
// 兼容:支持 ids/staffIds 传 CSV也支持重复参数数组
Set<String> idSet = new LinkedHashSet<>(parseRequestIds(request, "ids", ids));
idSet.addAll(parseRequestIds(request, "staffIds", staffIds));
for (String id : idSet) {
result += service.deleteById(id);
}
for (String id : ids) {
safetyFilesService.deleteByBizId(id);
}
model.addAttribute("result", result);
return "result";
}
private List<String> parseRequestIds(HttpServletRequest request, String paramName, String rawIds) {
List<String> result = new ArrayList<>(parseIdTokens(rawIds));
String[] values = request.getParameterValues(paramName);
if (values != null) {
for (String value : values) {
result.addAll(parseIdTokens(value));
}
}
return result;
}
private List<String> parseIdTokens(String rawIds) {
List<String> result = new ArrayList<>();
if (org.apache.commons.lang3.StringUtils.isBlank(rawIds) || "null".equals(rawIds)) {
return result;
}
String[] split = rawIds.split(",");
for (String id : split) {
String value = org.apache.commons.lang3.StringUtils.trim(id);
if (org.apache.commons.lang3.StringUtils.isNotBlank(value) && value.matches("^[0-9A-Za-z_-]+$")) {
result.add(value);
}
}
return result;
}
/**
* 跳转导入页面
*

View File

@ -114,6 +114,8 @@ public class SafetyCheckComprehensiveController {
model.addAttribute("checkItemList", SafetyCheckItemComprehensiveEnum.getAllEnableType4JSON());
//检查结果下拉
model.addAttribute("checkResultList", SafetyCheckResultEnum.getAllEnableType4JSON());
// 预生成ID用于附件上传
model.addAttribute("preId", UUID.randomUUID().toString());
return "safety/SafetyCheckComprehensiveAdd";
}
@ -126,13 +128,10 @@ public class SafetyCheckComprehensiveController {
@RequestMapping("/save.do")
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public Result save(HttpServletRequest request, SafetyCheckComprehensive bean, MultipartFile[] multipartFiles) throws Exception {
public Result save(HttpServletRequest request, SafetyCheckComprehensive bean) throws Exception {
User cu = (User) request.getSession().getAttribute("cu");
bean.setId(UUID.randomUUID().toString());
if (multipartFiles != null) {
for (MultipartFile file : multipartFiles) {
safetyFilesService.upload(request, file, SafetyFunctionEnum.SAFETY_CHECK_COMPREHENSIVE.getId(), SafetyCheckStatusEnum.APPLY.getId(), bean.getId());
}
if (StringUtils.isEmpty(bean.getId())) {
bean.setId(UUID.randomUUID().toString());
}
bean.setCheckCode(safetySeqService.code(request, SafetyFunctionEnum.SAFETY_CHECK_COMPREHENSIVE));
if (bean.getCheckResult() == SafetyCheckResultEnum.OK.getId()) {
@ -156,12 +155,12 @@ public class SafetyCheckComprehensiveController {
@RequestMapping("/saveApply.do")
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public Result saveApply(HttpServletRequest request, SafetyCheckComprehensive bean, MultipartFile[] file) throws Exception {
public Result saveApply(HttpServletRequest request, SafetyCheckComprehensive bean) throws Exception {
if (StringUtils.isEmpty(bean.getDutyUserId())) {
return Result.failed("整改负责人不能为空!");
}
save(request, bean, file);
save(request, bean);
// 不相符的才提交申请
if (bean.getCheckResult() == SafetyCheckResultEnum.NOT_OK.getId()) {
safetyCheckActivityService.apply(bean.getCreateUserId(), bean.getDutyUserId(), ProcessType.SAFETY_CHECK_COMPREHENSIVE, bean.getId());

View File

@ -339,16 +339,39 @@ public class SafetyExternalCertificateController {
@RequestMapping("/deletes.do")
@Transactional(rollbackFor = Exception.class)
public String delete(HttpServletRequest request, Model model, String[] ids) throws IOException {
public String delete(HttpServletRequest request, Model model,
@RequestParam(value = "ids", required = false) String ids,
@RequestParam(value = "staffIds", required = false) String staffIds) throws IOException {
int result = 0;
for (String id : ids) {
// 兼容:支持 ids/staffIds 传 CSV也支持重复参数数组
Set<String> certificateIdSet = new LinkedHashSet<>(parseRequestIds(request, "ids", ids));
Set<String> staffIdSet = new LinkedHashSet<>(parseRequestIds(request, "staffIds", staffIds));
for (String id : certificateIdSet) {
result += service.deleteById(id);
safetyFilesService.deleteByBizId(id);
}
for (String staffId : staffIdSet) {
safetyExternalStaffService.deleteById(staffId);
}
model.addAttribute("result", result);
return "result";
}
private List<String> parseRequestIds(HttpServletRequest request, String paramName, String rawIds) {
List<String> result = new ArrayList<>(parseExportIds(rawIds));
String[] values = request.getParameterValues(paramName);
if (values != null) {
for (String value : values) {
result.addAll(parseExportIds(value));
}
}
return result;
}
/**
* 跳转导入页面
*
@ -536,67 +559,61 @@ public class SafetyExternalCertificateController {
public void export(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "issueDate", required = false) String issueDate,
@RequestParam(value = "jobType", required = false) String jobType,
@RequestParam(value = "companyParam", required = false) String companyParam) throws IOException {
// 摘自列表查询接口 start
User cu = (User) request.getSession().getAttribute("cu");
@RequestParam(value = "companyParam", required = false) String companyParam,
@RequestParam(value = "search_name", required = false) String searchName,
@RequestParam(value = "ids", required = false) String ids,
@RequestParam(value = "staffIds", required = false) String staffIds) throws IOException {
// 与列表接口保持一致,避免“页面有数据但导出为空”
String sort = " sc.userid, sc.create_time ";
String order = " desc ";
String orderstr = " order by " + sort + " " + order;
String wherestr = " where flag='2' ";
if (request.getParameter("search_code") != null && !request.getParameter("search_code").isEmpty()) {
List<Unit> unitlist = unitService.getUnitChildrenById(request.getParameter("search_code"));
String pidstr = "";
for (int i = 0; i < unitlist.size(); i++) {
pidstr += "'" + unitlist.get(i).getId() + "',";
}
if (pidstr != "") {
pidstr = pidstr.substring(0, pidstr.length() - 1);
wherestr += "and u.pid in (" + pidstr + ") ";
}
} else {
Company company = unitService.getCompanyByUserId(cu.getId());
String companyId = "-1";
if (company != null) {
companyId = company.getId();
}
List<User> users = unitService.getChildrenUsersById(companyId);
String userIds = "";
for (User user : users) {
if (!userIds.isEmpty()) {
userIds += "','";
}
userIds += user.getId();
}
if (!userIds.isEmpty()) {
wherestr += "and u.id in ('" + userIds + "') ";
}
}
String wherestr = " where 1=1 ";
// 搜索框筛选
if (request.getParameter("search_name") != null && !request.getParameter("search_name").isEmpty()) {
wherestr += " and (sc.certificate_name like '%" + request.getParameter("search_name") + "%'" +
" or ses.name like '%" + request.getParameter("search_name") + "%')";
if (StringUtils.isNotBlank(searchName)) {
wherestr += " and (sc.certificate_name like '%" + searchName + "%'" +
" or ses.name like '%" + searchName + "%')";
}
// 领证时间筛选
if (StringUtils.isNotBlank(issueDate) && !"null".equals(issueDate)) {
String[] split = issueDate.split("~");
String issueDate_param_start_time = split[0].trim();
String issueDate_param_end_time = split[1].trim();
wherestr += " and sc.issue_date >= '" + issueDate_param_start_time + "'" +
" and sc.issue_date <= '" + issueDate_param_end_time + "'";
if (split.length == 2) {
String issueDate_param_start_time = split[0].trim();
String issueDate_param_end_time = split[1].trim();
wherestr += " and sc.issue_date >= '" + issueDate_param_start_time + "'" +
" and sc.issue_date <= '" + issueDate_param_end_time + "'";
}
}
//作业类型
// 作业类型
if (StringUtils.isNotBlank(jobType) && !"null".equals(jobType)) {
wherestr += " and sc.job_type = '" + jobType + "'";
}
//施工单位
// 施工单位
if (StringUtils.isNotBlank(companyParam) && !"null".equals(companyParam)) {
wherestr += " and ses.company = '" + companyParam + "'";
}
// 勾选导出:有勾选则仅导出勾选数据;无勾选则按筛选条件导出全部
List<String> certificateIdList = parseExportIds(ids);
List<String> staffIdList = parseExportIds(staffIds);
if (!CollectionUtils.isEmpty(certificateIdList) || !CollectionUtils.isEmpty(staffIdList)) {
StringBuilder selectedWhere = new StringBuilder(" and (");
if (!CollectionUtils.isEmpty(certificateIdList)) {
selectedWhere.append("sc.id in (").append(joinForSqlIn(certificateIdList)).append(")");
}
if (!CollectionUtils.isEmpty(staffIdList)) {
if (!CollectionUtils.isEmpty(certificateIdList)) {
selectedWhere.append(" or ");
}
selectedWhere.append("ses.id in (").append(joinForSqlIn(staffIdList)).append(")");
}
selectedWhere.append(")");
wherestr += selectedWhere;
}
List<SafetyExternalCertificateVo> list = this.service.selectListByConditionForExternal(wherestr + orderstr);
List<SafetyExternalCertificateExcel> excelList = new ArrayList<>();
SafetyExternalCertificateExcel excelEntity = null;
@ -605,7 +622,7 @@ public class SafetyExternalCertificateController {
BeanUtils.copyProperties(vo, excelEntity);
excelList.add(excelEntity);
}
// 摘自列表查询接口 end
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode("外部人员证书信息", "UTF-8") + ".xlsx");
@ -616,4 +633,31 @@ public class SafetyExternalCertificateController {
excelWriter.finish();
}
}
private List<String> parseExportIds(String rawIds) {
List<String> result = new ArrayList<>();
if (StringUtils.isBlank(rawIds) || "null".equals(rawIds)) {
return result;
}
String[] split = rawIds.split(",");
for (String id : split) {
String value = StringUtils.trim(id);
// 仅保留安全字符,避免拼接 SQL 时引入非法字符
if (StringUtils.isNotBlank(value) && value.matches("^[0-9A-Za-z_-]+$")) {
result.add(value);
}
}
return result;
}
private String joinForSqlIn(List<String> idList) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < idList.size(); i++) {
if (i > 0) {
sb.append(",");
}
sb.append("'").append(idList.get(i)).append("'");
}
return sb.toString();
}
}

View File

@ -134,6 +134,12 @@ public class SewageController {
public String dosave(HttpServletRequest request,Model model,
@ModelAttribute Sewage sewage) {
User cu = (User) request.getSession().getAttribute("cu");
String contractNumber = sewage.getContractNumber() == null ? null : sewage.getContractNumber().trim();
sewage.setContractNumber(contractNumber);
if (this.sewageService.existsByContractNumber(contractNumber)) {
model.addAttribute("result", "{\"res\":\"合同编号已存在,不可重复\"}");
return "result";
}
sewage.setId(CommUtil.getUUID());
int result = this.sewageService.save(sewage);
String resultstr = "{\"res\":\""+result+"\",\"id\":\""+sewage.getId()+"\"}";
@ -193,6 +199,12 @@ public class SewageController {
public String doupdate(HttpServletRequest request,Model model,
@ModelAttribute Sewage sewage) {
User cu = (User) request.getSession().getAttribute("cu");
String contractNumber = sewage.getContractNumber() == null ? null : sewage.getContractNumber().trim();
sewage.setContractNumber(contractNumber);
if (this.sewageService.existsByContractNumberExcludeId(contractNumber, sewage.getId())) {
model.addAttribute("result", "{\"res\":\"合同编号已存在,不可重复\"}");
return "result";
}
int result = this.sewageService.update(sewage);
String resstr="{\"res\":\""+result+"\",\"id\":\""+sewage.getId()+"\"}";
model.addAttribute("result", resstr);
@ -348,7 +360,8 @@ public class SewageController {
@RequestMapping(value = "downloadExcelFun.do")
public ModelAndView downloadExcelFun(HttpServletRequest request,
HttpServletResponse response, Model model) throws IOException {
this.sewageService.outExcelFun(response);
String ids = request.getParameter("ids");
this.sewageService.outExcelFun(response, ids);
return null;
}

View File

@ -242,11 +242,20 @@ public class ProcessSectionController {
@RequestMapping("/getProcessSection4Select.do")
public String getProcessSection4Select(HttpServletRequest request, Model model) {
String companyId = request.getParameter("companyId"); // 默认查询JSBZ???
// 使用unitService获取Unit信息因为companyId来自tb_unit
// companyId在不同页面可能来自tb_unit或tb_company统一兼容两种来源
Unit unit = this.unitService.getUnitById(companyId);
String unitType = null;
if (unit != null) {
unitType = unit.getType();
} else if (companyId != null && !companyId.isEmpty()) {
Company company = this.unitService.getCompById(companyId);
if (company != null) {
unitType = company.getType();
}
}
String wherestr = "where 1=1 and active='" + CommString.Active_True + "' ";
if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_COMPANY)) { // "C";//公司
if (CommString.UNIT_TYPE_COMPANY.equals(unitType)) { // "C";//公司
String bizs = "";//公司下属所有厂id
List<Unit> blist = this.unitService.getParentCompanyChildrenBizByUnitid(companyId);
if (blist != null && blist.size() > 0) {
@ -258,7 +267,7 @@ public class ProcessSectionController {
}
bizs = bizs.replace(",", "','");
wherestr += " and (unit_id='" + ProcessSection.UnitId_Sys + "' or (code not in (select code from tb_process_section where unit_id='" + ProcessSection.UnitId_Sys + "')) and unit_id in ('" + bizs + "') ) ";
} else if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_BIZ)) { // B 水厂
} else if (CommString.UNIT_TYPE_BIZ.equals(unitType)) { // B 水厂
wherestr += " and unit_id='" + companyId + "' ";
}
if (request.getParameter("search_name") != null && !request.getParameter("search_name").isEmpty()) {
@ -273,13 +282,16 @@ public class ProcessSectionController {
for (int i = 0; i < processSections.size(); i++) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", processSections.get(i).getCode());
if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_COMPANY)) { // "C";//公司
if (CommString.UNIT_TYPE_COMPANY.equals(unitType)) { // "C";//公司
if (!processSections.get(i).getUnitId().equals(ProcessSection.UnitId_Sys)) {
jsonObject.put("text", processSections.get(i).getSname() + "(" + processSections.get(i).getCompanySname() + ")");
} else {
jsonObject.put("text", processSections.get(i).getSname());
}
} else if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_BIZ)) { // "B";//水厂
} else if (CommString.UNIT_TYPE_BIZ.equals(unitType)) { // "B";//水厂
jsonObject.put("text", processSections.get(i).getSname());
} else {
// 兜底避免前端下拉出现有id无text导致显示为空
jsonObject.put("text", processSections.get(i).getSname());
}

View File

@ -89,11 +89,26 @@ public class KPIPointController {
// List<MPointHistory> lists = mPointHistoryService.selectListByTableAWhere("tb_mp_11_GNJ1_F","MeasureDT='2016-01-10 10:16:57'");
// int dd= mPointHistoryService.deleteByTableAWhere("tb_mp_11_GNJ1_F","MeasureDT='2016-01-10 10:16:57'");
for (int i=0; i < list.size(); i++) {
ProcessSection processSection = this.processSectionService.selectById(list.get(i).getProcesssectionid());
String rawBizId = list.get(i).getBizid();
ProcessSection processSection = this.processSectionService.selectById(list.get(i).getProcesssectionid());
if (processSection == null && list.get(i).getProcesssectionid() != null && !list.get(i).getProcesssectionid().isEmpty()) {
// KPI里历史数据存在按code保存工艺段的场景优先按厂区code匹配再回退到系统库
List<ProcessSection> processSectionList = this.processSectionService.selectSimpleListByWhere(
"where code='" + list.get(i).getProcesssectionid() + "' and unit_id='" + rawBizId + "' "
);
if (processSectionList == null || processSectionList.isEmpty()) {
processSectionList = this.processSectionService.selectSimpleListByWhere(
"where code='" + list.get(i).getProcesssectionid() + "' and unit_id='" + ProcessSection.UnitId_Sys + "' "
);
}
if (processSectionList != null && !processSectionList.isEmpty()) {
processSection = processSectionList.get(0);
}
}
if (processSection != null) {
list.get(i).setProcessectionname(processSection.getName());
}
Company company = this.unitService.getCompById(list.get(i).getBizid());
Company company = this.unitService.getCompById(rawBizId);
if (company != null) {
list.get(i).setBizid(company.getName());
}

View File

@ -1252,21 +1252,14 @@ public class WorkorderDetailController {
@RequestMapping("/doExportRepair.do")
public ModelAndView doExportRepair(HttpServletRequest request,
HttpServletResponse response, Model model,
@RequestParam(value = "ids") String ids,
@RequestParam(value = "ids", required = false) String ids,
@RequestParam(value = "type") String type) throws IOException {
if (ids != null && !ids.equals("")) {
String[] id = ids.split(",");
String workorderDetailsIds = "";
for (String s : id) {
workorderDetailsIds += "'" + s + "',";
}
String whereStr = "where id in (" + workorderDetailsIds.substring(0, workorderDetailsIds.length() - 1) + ")";
try {
List<WorkorderDetail> workorderDetails = workorderDetailService.selectListByWhere(whereStr);
this.workorderDetailService.doExportRepair(response, workorderDetails, type);
} catch (Exception e) {
e.printStackTrace();
}
String whereStr = buildExportWhereByIdsAndType(ids, type);
try {
List<WorkorderDetail> workorderDetails = workorderDetailService.selectListByWhere(whereStr);
this.workorderDetailService.doExportRepair(response, workorderDetails, type);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@ -1292,21 +1285,14 @@ public class WorkorderDetailController {
@RequestMapping("/doExportRepairJS.do")
public ModelAndView doExportRepairJS(HttpServletRequest request,
HttpServletResponse response, Model model,
@RequestParam(value = "ids") String ids,
@RequestParam(value = "ids", required = false) String ids,
@RequestParam(value = "type") String type) throws IOException {
if (ids != null && !ids.equals("")) {
String[] id = ids.split(",");
String workorderDetailsIds = "";
for (String s : id) {
workorderDetailsIds += "'" + s + "',";
}
String whereStr = "where id in (" + workorderDetailsIds.substring(0, workorderDetailsIds.length() - 1) + ")";
try {
List<WorkorderDetail> workorderDetails = workorderDetailService.selectListByWhere(whereStr);
this.workorderDetailService.doExportRepairJS(response, workorderDetails, type);
} catch (Exception e) {
e.printStackTrace();
}
String whereStr = buildExportWhereByIdsAndType(ids, type);
try {
List<WorkorderDetail> workorderDetails = workorderDetailService.selectListByWhere(whereStr);
this.workorderDetailService.doExportRepairJS(response, workorderDetails, type);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@ -1332,26 +1318,47 @@ public class WorkorderDetailController {
@RequestMapping("/doExportMain.do")
public ModelAndView doExportMain(HttpServletRequest request,
HttpServletResponse response, Model model,
@RequestParam(value = "ids") String ids,
@RequestParam(value = "ids", required = false) String ids,
@RequestParam(value = "type") String type) throws IOException {
if (ids != null && !ids.equals("")) {
String[] id = ids.split(",");
String workorderDetailsIds = "";
for (String s : id) {
workorderDetailsIds += "'" + s + "',";
}
String whereStr = "where id in (" + workorderDetailsIds.substring(0, workorderDetailsIds.length() - 1) + ")";
// System.out.println(whereStr);
try {
List<WorkorderDetail> workorderDetails = workorderDetailService.selectListByWhere(whereStr);
this.workorderDetailService.doExportMain(response, workorderDetails, type);
} catch (Exception e) {
e.printStackTrace();
}
String whereStr = buildExportWhereByIdsAndType(ids, type);
try {
List<WorkorderDetail> workorderDetails = workorderDetailService.selectListByWhere(whereStr);
this.workorderDetailService.doExportMain(response, workorderDetails, type);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String buildExportWhereByIdsAndType(String ids, String type) {
String normalizedIds = normalizeIds(ids);
if (!normalizedIds.isEmpty()) {
String[] idArr = normalizedIds.split(",");
StringBuilder idBuilder = new StringBuilder();
for (String item : idArr) {
String id = item.trim();
if (id.isEmpty()) {
continue;
}
if (idBuilder.length() > 0) {
idBuilder.append(",");
}
idBuilder.append("'").append(id).append("'");
}
if (idBuilder.length() > 0) {
return "where id in (" + idBuilder + ")";
}
}
return "where type = '" + type + "'";
}
private String normalizeIds(String ids) {
if (ids == null || ids.trim().isEmpty()) {
return "";
}
return ids.replace("'", "").replace(" ", "").replaceAll(",+$", "");
}
/**
* 日历中弹出指定日期的 维修单
*

View File

@ -5,6 +5,7 @@ import com.sipai.entity.sparepart.Sewage;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public class SewageDao extends CommDaoImpl<Sewage> {
@ -17,4 +18,12 @@ public class SewageDao extends CommDaoImpl<Sewage> {
return list;
}
public Integer selectCountByContractNumber(String contractNumber) {
return getSqlSession().selectOne(this.getMappernamespace() + "." + Thread.currentThread().getStackTrace()[1].getMethodName(), contractNumber);
}
public Integer selectCountByContractNumberExcludeId(Map<String, String> params) {
return getSqlSession().selectOne(this.getMappernamespace() + "." + Thread.currentThread().getStackTrace()[1].getMethodName(), params);
}
}

View File

@ -312,6 +312,17 @@
delete from TB_Sewage_Source
${where}
</delete>
<select id="selectCountByContractNumber" resultType="java.lang.Integer" parameterType="java.lang.String" >
select count(1)
from TB_Sewage_Source
where contract_number = #{contractNumber,jdbcType=VARCHAR}
</select>
<select id="selectCountByContractNumberExcludeId" resultType="java.lang.Integer" parameterType="java.util.Map" >
select count(1)
from TB_Sewage_Source
where contract_number = #{contractNumber,jdbcType=VARCHAR}
and id != #{id,jdbcType=VARCHAR}
</select>
<select id="selectDistinctCityByWhere" resultMap="BaseResultMap" parameterType="java.lang.String" >
select Distinct [city] as [city]
from TB_Sewage_Source

View File

@ -34,9 +34,16 @@ public class AuthorizeTag extends BodyTagSupport {
@SuppressWarnings("static-access")
@Override
public int doStartTag() {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return this.SKIP_BODY;
}
HttpServletRequest request = requestAttributes.getRequest();
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request
.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
if (securityContextImpl == null || securityContextImpl.getAuthentication() == null) {
return this.SKIP_BODY;
}
try {
//获取当前登录名
String name = securityContextImpl.getAuthentication().getName();

View File

@ -284,22 +284,8 @@ public class WorkflowProcessDefinitionService {
String id = activityImpl.getId();
if(taskDefinitionKey.toLowerCase().equals(id.toLowerCase())){
System.out.println("当前执行的任务:"+activityImpl.getProperty("name"));
//获取从某个节点出来的所有子节点-网关
List<PvmTransition> outTransitions_gw = activityImpl.getOutgoingTransitions();
for(PvmTransition tr_gw:outTransitions_gw){
//获取线路的终点节点-网关
PvmActivity ac_gw = tr_gw.getDestination();
if(ac_gw.getProperty("type").equals("userTask") || ac_gw.getProperty("type").equals("endEvent")){
activityImpls.add((ActivityImpl)ac_gw);
}else{
List<PvmTransition> outTransitions =ac_gw.getOutgoingTransitions();
for(PvmTransition tr:outTransitions){
PvmActivity ac = tr.getDestination();
ActivityImpl itemActivityImpl =(ActivityImpl)ac;
activityImpls.add(itemActivityImpl);
}
}
}
//获取从某个节点出来的所有子节点(递归处理多层网关嵌套)
collectNextActivities(activityImpl.getOutgoingTransitions(), activityImpls);
break;
}
}
@ -318,27 +304,37 @@ public class WorkflowProcessDefinitionService {
if (taskDefinitionKey.toLowerCase().equals(id.toLowerCase()) || (StringUtil.isBlank(taskDefinitionKey) &&
activityImpl.getProperty("type").equals("startEvent"))) {
System.out.println("当前执行的任务:" + activityImpl.getProperty("name"));
//获取从某个节点出来的所有子节点-网关
List<PvmTransition> outTransitions_gw = activityImpl.getOutgoingTransitions();
for (PvmTransition tr_gw : outTransitions_gw) {
//获取线路的终点节点-网关
PvmActivity ac_gw = tr_gw.getDestination();
if (ac_gw.getProperty("type").equals("userTask") || ac_gw.getProperty("type").equals("endEvent")) {
activityImpls.add((ActivityImpl) ac_gw);
} else {
List<PvmTransition> outTransitions = ac_gw.getOutgoingTransitions();
for (PvmTransition tr : outTransitions) {
PvmActivity ac = tr.getDestination();
ActivityImpl itemActivityImpl = (ActivityImpl) ac;
activityImpls.add(itemActivityImpl);
}
}
}
//获取从某个节点出来的所有子节点
collectNextActivities(activityImpl.getOutgoingTransitions(), activityImpls);
break;
}
}
return activityImpls;
}
/**
* 递归收集后续节点,处理多层网关嵌套
* @param transitions 当前层的流出路径
* @param result 收集结果的列表
*/
private void collectNextActivities(List<PvmTransition> transitions, List<ActivityImpl> result) {
if (transitions == null || transitions.isEmpty()) {
return;
}
for (PvmTransition tr : transitions) {
PvmActivity dest = tr.getDestination();
String destType = String.valueOf(dest.getProperty("type"));
if ("userTask".equals(destType) || "endEvent".equals(destType)) {
// 目标是用户任务或结束事件,直接收集
result.add((ActivityImpl) dest);
} else if ("exclusiveGateway".equals(destType) || "parallelGateway".equals(destType)
|| "inclusiveGateway".equals(destType)) {
// 目标是网关,递归遍历其流出路径
collectNextActivities(dest.getOutgoingTransitions(), result);
}
// 其他类型如serviceTask、scriptTask等忽略
}
}
/**
* 查找含routeNum的workTask
* @param processDefId
@ -395,12 +391,12 @@ public class WorkflowProcessDefinitionService {
return list;
}
/**
* 获取两节点的路径条件--20190710-王贤平
* 递归查找从sourceTaskDefId到destTaskDefId的路径条件处理多层网关嵌套
* @param processDefId
* @param sourceTaskDefId
* @param destTaskDefId
* @param processDefId
* @param pvmTransitionId 出现多路径时,避免重复
* @return
* @param pvmTransitionId 出现多路径时,避免重复
* @return 带条件文本的路径(优先返回第一个含有条件的路径)
*/
public PvmTransition getTransition(String processDefId,String sourceTaskDefId,String destTaskDefId,String pvmTransitionId) {
@ -410,28 +406,52 @@ public class WorkflowProcessDefinitionService {
for(ActivityImpl activityImpl:activitiList){
String id = activityImpl.getId();
if(sourceTaskDefId.toLowerCase().equals(id.toLowerCase())){
//获取从某个节点出来的所有子节点-网关
List<PvmTransition> outTransitions_gw = activityImpl.getOutgoingTransitions();
for(PvmTransition tr_gw:outTransitions_gw){
//获取线路的终点节点-网关
PvmActivity ac_gw = tr_gw.getDestination();
if(ac_gw.getId().equals(destTaskDefId) && !tr_gw.getId().equals(pvmTransitionId)){
return tr_gw;
}else{
List<PvmTransition> outTransitions =ac_gw.getOutgoingTransitions();
for(PvmTransition tr:outTransitions){
PvmActivity ac = tr.getDestination();
if(ac.getId().equals(destTaskDefId) && !tr.getId().equals(pvmTransitionId)){
return tr;
}
}
}
}
break;
PvmTransition result = findTransitionToDestination(activityImpl.getOutgoingTransitions(), destTaskDefId, pvmTransitionId, null);
return result;
}
}
return null;
}
/**
* 递归遍历路径,查找目标节点,处理多层网关嵌套
* @param transitions 当前层的流出路径
* @param destTaskDefId 目标节点ID
* @param pvmTransitionId 需要跳过的路径ID
* @param firstConditionTransition 第一个含有条件文本的路径(优先返回)
* @return 带条件文本的路径,或直接到达目标的路径
*/
private PvmTransition findTransitionToDestination(List<PvmTransition> transitions, String destTaskDefId, String pvmTransitionId, PvmTransition firstConditionTransition) {
if (transitions == null || transitions.isEmpty()) {
return null;
}
for (PvmTransition tr : transitions) {
if (tr.getId().equals(pvmTransitionId)) {
continue;
}
PvmActivity dest = tr.getDestination();
// 记录第一个含有条件文本的路径
PvmTransition conditionTransition = firstConditionTransition;
String conditionText = String.valueOf(tr.getProperty("conditionText"));
if (conditionTransition == null && conditionText != null && !conditionText.isEmpty() && !"null".equals(conditionText)) {
conditionTransition = tr;
}
// 直接找到目标节点
if (dest.getId().equals(destTaskDefId)) {
return conditionTransition != null ? conditionTransition : tr;
}
// 目标是网关,递归遍历
String destType = String.valueOf(dest.getProperty("type"));
if ("exclusiveGateway".equals(destType) || "parallelGateway".equals(destType)
|| "inclusiveGateway".equals(destType)) {
PvmTransition found = findTransitionToDestination(dest.getOutgoingTransitions(), destTaskDefId, pvmTransitionId, conditionTransition);
if (found != null) {
return found;
}
}
}
return null;
}
/**
*
* 根据任务单编号获取流程定义

View File

@ -20,9 +20,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -391,7 +394,7 @@ public class CommonFileServiceImpl implements CommonFileService {
CommonFile commonFile = new CommonFile();
commonFile.setId(CommUtil.getUUID());
commonFile.setMasterid(masterId);
// 20210105 YYJ 用于文件表绑定料节点用字段 tb_doc_file内和masterId一样
// 20210105 YYJ 用于文件表绑定<EFBFBD><EFBFBD>料节点用字段 tb_doc_file内和masterId一样
// commonFile.setPid(masterId);
commonFile.setFilename(fileName); // 保存原始文件名用于显示
commonFile.setType(contentType);
@ -400,6 +403,19 @@ public class CommonFileServiceImpl implements CommonFileService {
commonFile.setAbspath(filePath); // 保存MinIO对象名称
commonFile.setInsdt(CommUtil.nowDate());
commonFile.setSize((int) item.getSize());
// 获取当前用户ID并设置
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
User cu = (User) request.getSession().getAttribute("cu");
if (cu != null) {
commonFile.setInsuser(cu.getId());
}
}
} catch (Exception e) {
logger.warn("无法获取当前用户信息: {}", e.getMessage());
}
res = this.insertByTable(tableName, commonFile);
} catch (Exception e) {
logger.error("Failed to update file to MinIO for masterId: {}", masterId, e);

View File

@ -26,8 +26,11 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
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 static org.apache.poi.ss.usermodel.CellType.STRING;
@ -142,6 +145,28 @@ public class SewageService implements CommService<Sewage> {
return list;
}
public boolean existsByContractNumber(String contractNumber) {
if (contractNumber == null || contractNumber.trim().isEmpty()) {
return false;
}
Integer count = SewageDao.selectCountByContractNumber(contractNumber.trim());
return count != null && count > 0;
}
public boolean existsByContractNumberExcludeId(String contractNumber, String id) {
if (contractNumber == null || contractNumber.trim().isEmpty()) {
return false;
}
if (id == null || id.trim().isEmpty()) {
return existsByContractNumber(contractNumber);
}
Map<String, String> params = new HashMap<String, String>();
params.put("contractNumber", contractNumber.trim());
params.put("id", id.trim());
Integer count = SewageDao.selectCountByContractNumberExcludeId(params);
return count != null && count > 0;
}
/**
* xls文件数据转换
*
@ -298,6 +323,10 @@ public class SewageService implements CommService<Sewage> {
}
public void outExcelFun(HttpServletResponse response) throws IOException {
outExcelFun(response, null);
}
public void outExcelFun(HttpServletResponse response, String ids) throws IOException {
String fileName = "金山卫污水厂纳管企业表.xls";
String title = "纳管企业";
// 声明一个工作薄
@ -428,7 +457,7 @@ public class SewageService implements CommService<Sewage> {
// smcell.setCellStyle(tipStyle);
// smcell.setCellValue("注:日期格式(xxxx-xx-xx或xxxx/xx/xx), 班组类型,班组, 班次(根据系统配置名称填写),模式(填写巡检菜单里面的巡检模式) 排版日期,班组类型,班组,班次,模式都为必填项(集控班组可不填模式)。");
List<Sewage> list = this.selectListByWhere("where 1=1 order by contract_order asc");
List<Sewage> list = this.selectListByWhere(buildExportWhere(ids));
int n = 1;
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
@ -577,6 +606,29 @@ public class SewageService implements CommService<Sewage> {
}
}
private String buildExportWhere(String ids) {
String orderBy = " order by contract_order asc";
if (ids == null || ids.trim().isEmpty()) {
return "where 1=1" + orderBy;
}
String[] arr = ids.split(",");
List<String> idList = new ArrayList<String>();
for (String item : arr) {
if (item == null) {
continue;
}
String id = item.trim();
if (!id.isEmpty() && id.matches("[A-Za-z0-9-]+")) {
idList.add("'" + id + "'");
}
}
if (idList.isEmpty()) {
return "where 1=1" + orderBy;
}
String idstr = String.join(",", idList);
return "where id in (" + idstr + ")" + orderBy;
}
/**
* 获取树三层结构processSection为根节点sewage为子节点
*

View File

@ -0,0 +1,261 @@
package com.sipai.tools;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
/**
* 设备HTTP访问工具类
* <ul>
* <li>发送时自动填充设备相关请求头</li>
* <li>接收时解析并校验请求头,防止重放、参数篡改、时间戳过期等安全风险</li>
* <li>提供AES加密/解密工具,保护敏感信息</li>
* <li>支持配置化密钥和时间戳有效期,便于运维和安全加固</li>
* </ul>
* <p>
* 主要头部:
* Dh-Device-Ip、Dh-Device-User、Dh-Device-Password、Dh-Device-Timestamp、Dh-Device-Port
* <p>
* 推荐通过Spring注入本工具类避免静态方法带来的配置注入问题。
*/
@Component
public class DeviceAccessHttpUtil {
/**
* AES加密密钥长度16位。可通过配置覆盖避免硬编码泄露。
*/
private static String AES_KEY = "NetSDK1234567890"; // 16位密钥
@Value("${crypto.aes-key:NetSDK1234567890}")
public void setAesKey(String aesKey) {
String key = aesKey == null ? "" : aesKey.trim();
if (key.length() != 16 && key.length() != 24 && key.length() != 32) {
throw new IllegalArgumentException("crypto.aes-key length must be 16/24/32");
}
AES_KEY = key;
}
/**
* 设备请求时间戳有效期毫秒默认5分钟。可通过配置覆盖。
* 注意:内部会转换为微秒进行比较,以支持微秒级时间戳精度。
*/
private static long TIMESTAMP_EXPIRE_MS = 300000L;
@Value("${device.timestamp.expire-ms:300000}")
public void setTimestampExpireMs(long timestampExpireMs) {
TIMESTAMP_EXPIRE_MS = timestampExpireMs;
}
private static final String ALGORITHM = "AES";
// 设备 HTTP 头部 key 常量,便于全局复用和维护
public static final String HEADER_DEVICE_IP = "Dh-Device-Ip";
public static final String HEADER_DEVICE_USER = "Dh-Device-User";
public static final String HEADER_DEVICE_PASSWORD = "Dh-Device-Password";
public static final String HEADER_DEVICE_TIMESTAMP = "Dh-Device-Timestamp";
public static final String HEADER_DEVICE_PORT = "Dh-Device-Port";
/**
* 防重放 nonce 集合及最大容量,防止同一加密串被多次使用。
*/
private static final int NONCE_SET_MAX_SIZE = 10000;
private static final java.util.Set<String> usedNonceSet = java.util.Collections.synchronizedSet(new java.util.LinkedHashSet<>());
/**
* 构造设备访问请求头,自动加密密码并填充所有必需字段。
* 使用方式获取返回结果遍历map kv直接填充到请求头。
* @param ip 设备IP
* @param user 用户名
* @param password 明文密码
* @param timestamp 时间戳建议用System.nanoTime()获取微秒级时间戳)
* @param port 端口号
* @return 设备请求头Map
* @throws Exception 加密异常
*/
public static Map<String, String> buildDeviceHeaders(String ip, String user, String password, String timestamp, String port) throws Exception {
Map<String, String> headers = new HashMap<>();
headers.put(HEADER_DEVICE_IP, ip);
headers.put(HEADER_DEVICE_USER, user);
headers.put(HEADER_DEVICE_TIMESTAMP, timestamp);
headers.put(HEADER_DEVICE_PORT, port);
// 密码加密password|timestamp
String encPwd = encryptWithTimestamp(password, timestamp);
headers.put(HEADER_DEVICE_PASSWORD, encPwd);
return headers;
}
/**
* 解析并校验设备请求头返回解析结果DeviceAccessInfo。
* 校验项:参数完整性、密码解密、时间戳一致性、防重放、端口校验。
* 校验失败抛异常。
* @param request HttpServletRequest
* @return DeviceAccessInfoip、user、password、timestamp、port
* @throws IllegalArgumentException 校验或解密异常
*/
public static DeviceAccessInfo parseAndValidateDeviceHeaders(javax.servlet.http.HttpServletRequest request) {
String ip = request.getHeader(HEADER_DEVICE_IP);
String encPwd = request.getHeader(HEADER_DEVICE_PASSWORD);
String user = request.getHeader(HEADER_DEVICE_USER);
String ts = request.getHeader(HEADER_DEVICE_TIMESTAMP);
String portStr = request.getHeader(HEADER_DEVICE_PORT);
if (user == null || user.isEmpty()) user = "admin";
return parseAndValidateDeviceHeaders(ip, encPwd, user, ts, portStr);
}
/**
* 统一参数校验和解密逻辑失败抛异常成功返回DeviceAccessInfo。
* <ul>
* <li>参数完整性校验</li>
* <li>重放攻击防护(同一加密串只允许用一次)</li>
* <li>密码解密与格式校验</li>
* <li>时间戳一致性与有效期校验</li>
* <li>端口号格式校验</li>
* </ul>
* @param ip 设备IP
* @param encPwd 加密密码
* @param user 用户名
* @param ts 时间戳
* @param portStr 端口字符串
* @return DeviceAccessInfo 校验通过的设备信息
* @throws IllegalArgumentException 校验失败
*/
public static DeviceAccessInfo parseAndValidateDeviceHeaders(String ip, String encPwd, String user, String ts, String portStr) {
if (ip == null || encPwd == null || ts == null) {
throw new IllegalArgumentException("缺少设备登录信息: ip, encPwd, ts");
}
String nonce = encPwd;
synchronized (usedNonceSet) {
if (usedNonceSet.contains(nonce)) {
throw new IllegalArgumentException("请求重放: nonce=" + nonce);
}
usedNonceSet.add(nonce);
if (usedNonceSet.size() > NONCE_SET_MAX_SIZE) {
String first = usedNonceSet.iterator().next();
usedNonceSet.remove(first);
}
}
String[] pwdTsNonce;
try {
pwdTsNonce = decryptWithTimestamp(encPwd);
} catch (Exception e) {
throw new IllegalArgumentException("密码解密异常: " + e.getMessage(), e);
}
if (pwdTsNonce.length != 2) {
throw new IllegalArgumentException("密码解密格式错误: encPwd=" + encPwd);
}
String pwd = pwdTsNonce[0];
String tsInPwd = pwdTsNonce[1];
if (!ts.equals(tsInPwd)) {
throw new IllegalArgumentException("时间戳校验失败: ts=" + ts + ", tsInPwd=" + tsInPwd);
}
long now = System.nanoTime();
long tsLong;
try { tsLong = Long.parseLong(ts); } catch (Exception e) {
throw new IllegalArgumentException("时间戳格式错误: ts=" + ts);
}
if (Math.abs(now - tsLong) > TIMESTAMP_EXPIRE_MS * 1000) { // 转换为微秒进行比较
throw new IllegalArgumentException("登录请求已过期: now=" + now + ", tsLong=" + tsLong + ", expireMs=" + TIMESTAMP_EXPIRE_MS);
}
int port = 37777;
if (portStr != null && !portStr.isEmpty()) {
try {
port = Integer.parseInt(portStr);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Device-Port格式错误: portStr=" + portStr);
}
}
return new DeviceAccessInfo(ip, user, pwd, ts, port);
}
/**
* AES加密ECB模式PKCS5Padding用于加密敏感数据。
* @param data 明文
* @return base64编码的密文
* @throws Exception 加密异常
*/
private static String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
}
/**
* AES解密ECB模式PKCS5Padding用于解密敏感数据。
* @param encryptedData base64编码的密文
* @return 明文
* @throws Exception 解密异常
*/
private static String decrypt(String encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decoded = Base64.getDecoder().decode(encryptedData);
byte[] decrypted = cipher.doFinal(decoded);
return new String(decrypted, StandardCharsets.UTF_8);
}
/**
* 生成加密字符串password|timestamp
* @param password 明文密码
* @param timestamp 时间戳
* @return 加密后字符串
* @throws Exception 加密异常
*/
private static String encryptWithTimestamp(String password, String timestamp) throws Exception {
return encrypt(password + "|" + timestamp);
}
/**
* 解密并返回[password, timestamp]
* @param encryptedData 加密后字符串
* @return [password, timestamp]
* @throws Exception 解密异常
*/
private static String[] decryptWithTimestamp(String encryptedData) throws Exception {
String plain = decrypt(encryptedData);
return plain.split("\\|", 2);
}
/**
* 设备访问信息结构体,封装所有校验通过的关键信息。
* 用于业务层安全登录、日志审计等场景。
*/
public static class DeviceAccessInfo {
/** 设备IP */
public final String ip;
/** 用户名 */
public final String user;
/** 明文密码(已解密) */
public final String password;
/** 时间戳 */
public final String timestamp;
/** 端口号 */
public final int port;
public DeviceAccessInfo(String ip, String user, String password, String timestamp, int port) {
this.ip = ip;
this.user = user;
this.password = password;
this.timestamp = timestamp;
this.port = port;
}
}
/**
* 本地测试主方法,演示加密解密流程。
*/
public static void main(String[] args) throws Exception {
String password = "admin";
String timestamp = String.valueOf(System.nanoTime());
String encrypted = encryptWithTimestamp(password, timestamp);
System.out.println("加密后: " + encrypted);
String[] decrypted = decryptWithTimestamp(encrypted);
System.out.println("解密后 password: " + decrypted[0]);
System.out.println("解密后 timestamp: " + decrypted[1]);
}
}

View File

@ -3,3 +3,28 @@ boturl=http://10.194.10.169:9206/nsapi/jqrsssj
bottoken=http://10.194.10.169:9206/nsapi/getoken?objkey=sipai
#interfaces=http://192.168.1.137:8080/BLG/assayMonthWater.do?method=sampleinto&params=
#interfaces=http://localhost:8099/SIPAIIS_WMS_HQAQ/whp/test/WhpSamplingPlanTaskAudit/test1111.do?method=sampleinto&params=
# Attendance third-party API settings
attendance.api.url=http://127.0.0.1:8090/dh-netsdk/attendance/getDailyRecordList
attendance.api.pageSize=200
attendance.api.deviceIp=192.168.1.108
attendance.api.deviceUser=admin
attendance.api.devicePort=37777
# Plain password used for header encryption.
attendance.api.devicePassword=
# DeviceAccessHttpUtil crypto settings
# AES key length must be 16/24/32 characters
crypto.aes-key=NetSDK1234567890
# Timestamp expiration (ms)
device.timestamp.expire-ms=300000
# Vehicle gate third-party API settings (independent from attendance.api.*)
vehicleGate.api.url=http://127.0.0.1:8090/dh-netsdk/vehicleGate/getDailyRecognizedVehicleList
vehicleGate.api.pageSize=200
vehicleGate.api.deviceIp=192.168.1.108
vehicleGate.api.deviceUser=admin
vehicleGate.api.devicePort=37777
# Plain password used for header encryption.
vehicleGate.api.devicePassword=

View File

@ -238,6 +238,10 @@ var processSelectNode = function(taskId){
//选择下一节点,先选择审核结果,再选择节点
$.post(ext.contextPath + "/activiti/workflow/getRoutesForSelect2.do", {taskId:taskId,passFlag:passFlag}, function(data) {
$("#routeNum").empty();
if (!data || data.length === 0) {
console.warn('getRoutesForSelect2: no routes found for passFlag=' + passFlag);
return;
}
var selelct = $("#routeNum").select2({
data: data,
placeholder:'请先选择审核结果',//默认文字提示

View File

@ -116,8 +116,11 @@ var getFileListMinioPic = function (divId, status, entityId, previews, previewCo
tbName: tbName,
bucketName: bucketName
}, function (data) {
// 清空数组而不是重新赋值,这样可以保持引用不变
previews.length = 0;
previewConfigs.length = 0;
if (data.length > 0) {
previews = new Array();
$('#maintenancefile').show();
for (var i = 0; i < data.length; i++) {
var previewConfig = new Object();
@ -133,10 +136,9 @@ var getFileListMinioPic = function (divId, status, entityId, previews, previewCo
}
previewConfigs.push(previewConfig);
}
showFileInput_new(divId, previews, previewConfigs);
} else {
$('#' + divId).hide();
}
// 无论是否有数据都重新初始化控件
showFileInput_new(divId, previews, previewConfigs);
}, 'json');
};

View File

@ -147,7 +147,7 @@
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">员工考勤记录</h3>
<span class="text-muted" style="margin-left: 10px;">当前为第三方考勤接口模拟数据MOCK</span>
<span class="text-muted" style="margin-left: 10px;">当前为第三方考勤接口实时数据</span>
</div>
<div class="box-body">
<div class="form-inline" style="margin-bottom: 10px;">

View File

@ -1,9 +1,10 @@
<%@ page language="java" pageEncoding="UTF-8" %>
<script type="text/javascript">
var previews = new Array();
var previewConfigs = new Array();
var filelist = new Array();
// 不重新定义这些变量,直接使用主页面的全局变量
// var previews = new Array();
// var previewConfigs = new Array();
// var filelist = new Array();
//初始化fileinput控件第一次初始化
function initFileInput(ctrlName, uploadUrl) {
@ -55,9 +56,10 @@
//导入文件上传完成之后的事件
control.on("fileuploaded", function (event, data, previewId, index) {
if (data.response.suc) {
<%--getFileListMinioPic('${param.divId}','edit');--%>
// getFileListMinioPic('abnormityFileId', 'edit', '', previews, previewConfigs);
// 直接使用主页面的全局变量重新加载文件列表
getFileListMinioPic('${param.divId}', 'edit', '', previews, previewConfigs);
// 关闭上传弹窗,返回主页面
closeModal('fileInputModal');
}
});
}

View File

@ -551,6 +551,8 @@
if($(".file-preview-thumbnails").html() == null || $(".file-preview-thumbnails").html().length==0 || $.trim($(".file-preview-thumbnails").html())==''){
showAlert('d','上传的文件不能为空!','alertFileEditDiv');
} else {
var editorText = editor.txt.html();
$("#wContent").val(editorText);
$.post(ext.contextPath + "/documentData/doupdate.do", $("#fileInputModalForm").serialize(), function (data) {
if (data.res == 1){
$("#fileTable").bootstrapTable('refresh');

View File

@ -296,7 +296,17 @@
function exportExcel() {
var periodTypeName = $('#periodTypeList').val();
var positionType = $('#positionTypeList').val();
window.open(ext.contextPath + "/kpi/kpiPlan/export.do?periodTypeName=" + periodTypeName + "&positionType=" + positionType);
let checkedItems = $("#table").bootstrapTable('getSelections');
let ids = "";
$.each(checkedItems, function (index, item) {
ids += item.id + ",";
});
if (ids !== "") {
ids = ids.substring(0, ids.length - 1);
window.open(ext.contextPath + "/kpi/kpiPlan/export.do?periodTypeName=" + periodTypeName + "&positionType=" + positionType + "&ids=" + encodeURIComponent(ids));
} else {
window.open(ext.contextPath + "/kpi/kpiPlan/export.do?periodTypeName=" + periodTypeName + "&positionType=" + positionType);
}
}
</script>

View File

@ -636,45 +636,77 @@
var enterpriseTotal = 0;
var enterpriseOnline = 0;
var enterpriseList = [];
var enterprisePageSize = 20; // 每页20条
var enterpriseCurrentPage = 1; // 当前页码
// 加载企业数据
// 加载企业数据(分页)
function loadEnterpriseData() {
loadEnterpriseList(enterpriseCurrentPage);
}
// 加载企业列表(分页)
function loadEnterpriseList(page) {
enterpriseCurrentPage = page;
$.ajax({
type: 'POST',
url: ext.contextPath + '/sparepart/sewage/getList.do',
data: {
page: 1,
rows: 1000,
page: page,
rows: enterprisePageSize,
sort: "displacement",
order: "asc",
unitId: '0533JS',
unitId: defaultUnitId,
},
// async: true,
// dataType: 'json',
// globle: false,
async: true,
globle: false,
error: function () {
// loadEnterpriseDataMock();
return false;
},
success: function (data) {
if (typeof data === "string") {
var dataList = JSON.parse(data);
if (dataList && dataList.rows) {
var list = dataList.rows || [];
enterpriseTotal = dataList.total;
enterpriseOnline = list.filter(function(item) {
return item._input;
}).length;
enterpriseList = list;
renderEnterpriseStats();
renderEnterpriseList(list);
} else {
loadEnterpriseDataMock();
if (typeof data === "string") {
var dataList = JSON.parse(data);
if (dataList && dataList.rows) {
var list = dataList.rows || [];
enterpriseTotal = dataList.total;
// 统计在线数量(全部数据,不仅仅是当前页)
enterpriseOnline = list.filter(function(item) {
return item._input;
}).length;
enterpriseList = list;
// 为每个企业查询瞬时流量
var promises = [];
list.forEach(function(item) {
if (item.ventNum) {
var mpointCode = item.ventNum + '_SSLL';
promises.push(
getMpointValueAsync(mpointCode).then(function(value) {
item.flow = value.parmvalue || '0';
})
);
} else {
item.flow = '--';
}
});
// 等待所有瞬时流量查询完成后渲染
Promise.all(promises).then(function() {
renderEnterpriseStats();
renderEnterpriseList(list);
renderEnterprisePagination();
}).catch(function() {
renderEnterpriseStats();
renderEnterpriseList(list);
renderEnterprisePagination();
});
} else {
loadEnterpriseDataMock();
}
}
}
}
});
}
});
}
// Mock企业数据
function loadEnterpriseDataMock() {
@ -700,9 +732,10 @@
$('#enterprise_total').text(enterpriseTotal);
$('#enterprise_online').text(enterpriseOnline);
$('#enterprise_offline').text(enterpriseTotal - enterpriseOnline);
// 计算总流量
// 计算总流量(当前页)
var totalFlow = enterpriseList.reduce(function(sum, item) {
return sum + (item.attributes && item.attributes.flow ? item.attributes.flow : 0);
var flow = item.flow || 0;
return sum + (typeof flow === 'number' ? flow : 0);
}, 0);
$('#enterprise_total_flow').text(formatNumber(totalFlow));
}
@ -713,7 +746,7 @@
list.forEach(function(item) {
var name = item.name || item.text || '--';
var status = item._input ? 'online' : 'offline';
var flow = item.attributes && item.attributes.flow ? item.attributes.flow : 0;
var flow = item.flow || '--';
var statusClass = status === 'online' ? 'online' : 'offline';
var statusText = status === 'online' ? '已接入' : '未接入';
@ -734,9 +767,34 @@
$('#enterprise_list').html(html);
}
// 渲染企业分页控件
function renderEnterprisePagination() {
var totalPages = Math.ceil(enterpriseTotal / enterprisePageSize);
// 更新分页信息
var pageInfo = '第 ' + enterpriseCurrentPage + '/' + totalPages + ' 页,共 ' + enterpriseTotal + ' 条';
$('#enterprise_page_info').text(pageInfo);
// 更新分页按钮
var btnHtml = '';
btnHtml += '<button class="pagination-btn" onclick="enterpriseGoToPage(1)" ' + (enterpriseCurrentPage === 1 ? 'disabled' : '') + '>首页</button>';
btnHtml += '<button class="pagination-btn" onclick="enterpriseGoToPage(' + (enterpriseCurrentPage - 1) + ')" ' + (enterpriseCurrentPage === 1 ? 'disabled' : '') + '>上一页</button>';
btnHtml += '<button class="pagination-btn" onclick="enterpriseGoToPage(' + (enterpriseCurrentPage + 1) + ')" ' + (enterpriseCurrentPage >= totalPages ? 'disabled' : '') + '>下一页</button>';
btnHtml += '<button class="pagination-btn" onclick="enterpriseGoToPage(' + totalPages + ')" ' + (enterpriseCurrentPage >= totalPages ? 'disabled' : '') + '>末页</button>';
$('#enterprise_page_btns').html(btnHtml);
}
// 企业列表分页跳转
function enterpriseGoToPage(page) {
var totalPages = Math.ceil(enterpriseTotal / enterprisePageSize);
if (page < 1) page = 1;
if (page > totalPages) page = totalPages;
loadEnterpriseList(page);
}
// 格式化数字
function formatNumber(num) {
if (num === null || num === undefined) return '--';
if (num === null || num === undefined || num === '--') return '--';
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
@ -746,7 +804,7 @@
type: 'GET',
url: ext.contextPath + '/base/mainConfig/getJson.do',
async: true,
data: {unitId: unitId},
data: {unitId: defaultUnitId},
globle: false,
error: function () {
console.error('获取主配置数据失败');
@ -850,17 +908,19 @@
initPumpStations();
}
// 如果没有工艺配置,使用默认数据
var hasProcessConfig = mpcode.some(function(item) { return item.type === 'process'; });
if (!hasProcessConfig) {
initProcessList();
}
// // 如果没有工艺配置,使用默认数据
// var hasProcessConfig = mpcode.some(function(item) { return item.type === 'process'; });
// if (!hasProcessConfig) {
// initProcessList();
// }
initProcessListByConfig(code, divid);
// 如果没有告警配置,使用默认数据
var hasAlarmConfig = mpcode.some(function(item) { return item.type === 'alarm'; });
if (!hasAlarmConfig) {
initAlarmList();
}
// // 如果没有告警配置,使用默认数据
// var hasAlarmConfig = mpcode.some(function(item) { return item.type === 'alarm'; });
// if (!hasAlarmConfig) {
// initAlarmList();
// }
initAlarmListByConfig(code, divid)
}
function initData() {
@ -900,7 +960,7 @@
page: page,
sort: 'equipmentcardid',
order: 'asc',
unitId: unitId,
unitId: defaultUnitId,
},
async: true,
globle: false,
@ -1109,41 +1169,113 @@
return data;
}
// 根据配置初始化工艺列表
// 根据配置初始化工艺列表 - 调用工艺段接口(支持分页)
// /TGLW/user/processSection/getlist.do?rows=50&page=1&order=asc&search_code=0533JS&unitId=0533JS&search_name=&_=1775558221772
var processTotal = 0; // 工艺段总数
function initProcessListByConfig(mpointCode, containerId) {
loadProcessList(processCurrentPage);
}
// 加载工艺列表(分页)
function loadProcessList(page) {
processCurrentPage = page;
$.ajax({
type: 'GET',
url: ext.contextPath + '/work/mpoint/getProcessList.do?unitId=' + unitId + '&mpointCode=' + mpointCode,
url: ext.contextPath + '/user/processSection/getlist.do',
data: {
unitId: defaultUnitId,
rows: processPageSize,
page: page,
},
async: true,
dataType: 'json',
globle: false,
error: function () {
processData = generateProcessData();
renderProcessTable();
// processData = generateProcessData();
// renderProcessTable();
return false;
},
success: function (data) {
if (data != null && data !== '') {
try {
var result = eval('(' + data + ')');
if (result.status === 'pass' && result.processList) {
processData = result.processList;
renderProcessTable();
} else {
processData = generateProcessData();
renderProcessTable();
}
} catch (e) {
processData = generateProcessData();
if (data && data.rows) {
// 更新总数
processTotal = data.total || data.rows.length;
// 将接口返回的工艺段数据转换为表格格式
processData = [];
var rows = data.rows || [];
// 为每个工艺段获取测点值
var promises = [];
rows.forEach(function(item, index) {
var processItem = {
...item,
processName: item.text || item.name || '--',
param1: '--',
param2: '--',
param3: '--',
deviceId: item.id || ''
};
processData.push(processItem);
// 为param1, param2, param3创建获取值的Promise
['1', '2', '3'].forEach(function(suffix) {
var mpointCodeParam = item.id + '_' + suffix;
promises.push(
getMpointValueAsync(mpointCodeParam).then(function(value) {
let values = (value.parmname || '--') + ':' + (value.parmvalue || '--') + (value.unit || '')
if (suffix === '1') processItem.param1 = values;
else if (suffix === '2') processItem.param2 = values;
else if (suffix === '3') processItem.param3 = values;
})
);
});
});
// 等待所有测点值获取完成后渲染表格
Promise.all(promises).then(function() {
renderProcessTable();
}
renderProcessPagination();
}).catch(function() {
renderProcessTable();
renderProcessPagination();
});
} else {
processData = generateProcessData();
renderProcessTable();
// processData = generateProcessData();
// renderProcessTable();
}
}
});
}
// 异步获取测点值
function getMpointValueAsync(mpointCode) {
return new Promise(function(resolve) {
$.ajax({
type: 'GET',
url: ext.contextPath + '/work/mpoint/getValue.do',
data: {
unitId: defaultUnitId,
mpointCode: mpointCode
},
async: true,
dataType: 'json',
globle: false,
success: function(data) {
if (data && data.parmvalue !== undefined && data.parmvalue !== null) {
resolve(data);
// resolve(data.parmname + ':' + data.parmvalue + data.unit);
} else {
resolve('--');
}
},
error: function() {
resolve('--');
}
});
});
}
// 生成告警列表mock数据
function generateAlarmData() {
var processNames = ['粗格栅间', '细格栅间', '曝气沉砂池', '厌氧池', '缺氧池', '好氧池', '二沉池', '消毒池', '污泥浓缩池', '污泥脱水间'];
@ -1168,36 +1300,65 @@
return data;
}
// 根据配置初始化告警列表
// 根据配置初始化告警列表 - 调用告警接口
// 参考 proAlarmList.jsp 的接口调用
function initAlarmListByConfig(mpointCode, containerId) {
// 获取当前时间和7天前时间
var endTime = new Date();
var startTime = new Date(endTime.getTime() - 7 * 24 * 60 * 60 * 1000);
var formatDate = function(date) {
return date.getFullYear() + '-' +
String(date.getMonth() + 1).padStart(2, '0') + '-' +
String(date.getDate()).padStart(2, '0') + ' ' +
String(date.getHours()).padStart(2, '0') + ':' +
String(date.getMinutes()).padStart(2, '0');
};
$.ajax({
type: 'GET',
url: ext.contextPath + '/work/mpoint/getAlarmList.do?unitId=' + unitId + '&mpointCode=' + mpointCode,
type: 'POST',
url: ext.contextPath + '/alarm/proAlarm/getlist.do',
data: {
companyId: defaultUnitId,
search_name: '',
pSectionCode: '',
alarmType: '',
alarmlevel: '',
status: '',
sdt: formatDate(startTime),
edt: formatDate(endTime)
},
async: true,
dataType: 'json',
globle: false,
error: function () {
alarmData = generateAlarmData();
renderAlarmTable();
// alarmData = generateAlarmData();
// renderAlarmTable();
return false;
},
success: function (data) {
if (data != null && data !== '') {
try {
var result = eval('(' + data + ')');
if (result.status === 'pass' && result.alarmList) {
alarmData = result.alarmList;
renderAlarmTable();
} else {
alarmData = generateAlarmData();
renderAlarmTable();
}
} catch (e) {
alarmData = generateAlarmData();
renderAlarmTable();
}
} else {
alarmData = generateAlarmData();
if (data && data.rows && data.rows.length > 0) {
// 将接口返回的告警数据转换为表格格式
alarmData = [];
data.rows.forEach(function(item) {
alarmData.push({
id: item.id,
process: item.pointName || item.processSectionName || '--',
pointCode: item.pointCode || '',
status: item.status || '',
alarmLevel: item.alarmLevel || '',
alarmTime: item.alarmTime || '',
describe: item.describe || '',
alarmTypeName: item.alarmTypeName || '',
confirmerName: item.confirmerName || '',
confirmTime: item.confirmTime || '',
time: item.alarmTime ? item.alarmTime.substring(0, 16) : '--',
bizId: item.bizId || ''
});
});
renderAlarmTable();
} else {
// alarmData = generateAlarmData();
// renderAlarmTable();
}
}
});
@ -1209,14 +1370,11 @@
}
function renderProcessTable() {
var start = (processCurrentPage - 1) * processPageSize;
var end = Math.min(start + processPageSize, processData.length);
var pageData = processData.slice(start, end);
// 服务端分页processData 已经是当前页数据
var html = '';
pageData.forEach(function(process) {
processData.forEach(function(process) {
html += '<tr>';
html += '<td>' + process.name + '</td>';
html += '<td>' + (process.processName || process.name || '--') + '</td>';
html += '<td>' + process.param1 + '</td>';
html += '<td>' + process.param2 + '</td>';
html += '<td>' + process.param3 + '</td>';
@ -1224,26 +1382,30 @@
html += '</tr>';
});
$('#process_table tbody').html(html);
}
// 渲染工艺列表分页控件
function renderProcessPagination() {
var totalPages = Math.ceil(processTotal / processPageSize);
// 更新分页信息
var totalPages = Math.ceil(processData.length / processPageSize);
$('#process_page_info').text('第 ' + processCurrentPage + '/' + totalPages + ' 页,共 ' + processData.length + ' 条');
$('#process_page_info').text('第 ' + processCurrentPage + '/' + totalPages + ' 页,共 ' + processTotal + ' 条');
// 更新分页按钮
var btnHtml = '';
btnHtml += '<button class="pagination-btn" onclick="processGoToPage(1)" ' + (processCurrentPage === 1 ? 'disabled' : '') + '>首页</button>';
btnHtml += '<button class="pagination-btn" onclick="processGoToPage(' + (processCurrentPage - 1) + ')" ' + (processCurrentPage === 1 ? 'disabled' : '') + '>上一页</button>';
btnHtml += '<button class="pagination-btn" onclick="processGoToPage(' + (processCurrentPage + 1) + ')" ' + (processCurrentPage === totalPages ? 'disabled' : '') + '>下一页</button>';
// btnHtml += '<button class="pagination-btn" onclick="processGoToPage(' + totalPages + ')" ' + (processCurrentPage === totalPages ? 'disabled' : '') + '>末页</button>';
btnHtml += '<button class="pagination-btn" onclick="processGoToPage(' + (processCurrentPage + 1) + ')" ' + (processCurrentPage >= totalPages ? 'disabled' : '') + '>下一页</button>';
btnHtml += '<button class="pagination-btn" onclick="processGoToPage(' + totalPages + ')" ' + (processCurrentPage >= totalPages ? 'disabled' : '') + '>末页</button>';
$('#process_page_btns').html(btnHtml);
}
// 工艺列表分页跳转
function processGoToPage(page) {
var totalPages = Math.ceil(processData.length / processPageSize);
var totalPages = Math.ceil(processTotal / processPageSize);
if (page < 1) page = 1;
if (page > totalPages) page = totalPages;
processCurrentPage = page;
renderProcessTable();
loadProcessList(page);
}
function initAlarmList() {
@ -1595,6 +1757,12 @@
<div class="enterprise-list-wrapper" id="enterprise_list">
<!-- 企业卡片将通过JS动态生成 -->
</div>
<!-- 企业分页 -->
<div class="pagination">
<span class="pagination-info" id="enterprise_page_info"></span>
<div class="pagination-btns" id="enterprise_page_btns"></div>
</div>
</div>
</div>
</div>

View File

@ -173,8 +173,8 @@
return repo.text;
} // 函数用于呈现当前的选择
});
selelct_.val('').trigger("change");
selelct_.on('change', function () {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function () {
//工艺段选择后,清空原有工艺段选择的设备
$("#equipmentIds").val("");
$("#equipname").val("");

View File

@ -159,7 +159,7 @@
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct_.val('${abnormity.processSectionId}').trigger("change");
selelct_.val('${abnormity.processSectionId}').trigger("change.select2");
},'json');
};
var companyId = "${abnormity.bizId}";
@ -181,9 +181,9 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
if(data!=null && data.length>0){
selelct_.val('${abnormity.processSectionId}').trigger("change");
selelct_.val('${abnormity.processSectionId}').trigger("change.select2");
}
selelct_.on('change',function(){
selelct_.off("select2:select select2:clear").on("select2:select select2:clear",function(){
//工艺段选择后,清空原有工艺段选择的设备
$("#equipmentIds").val("");
$("#equipname").val("");

View File

@ -195,8 +195,8 @@
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear",function(e){
dosearch();
});
},'json');

View File

@ -156,8 +156,8 @@
return repo.text;
} // 函数用于呈现当前的选择
});
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
initAPPFun();
});
}, 'json');
@ -493,8 +493,8 @@
return repo.text;
} // 函数用于呈现当前的选择
});
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
// dosearch();
$("#table").bootstrapTable('refresh');
});

View File

@ -170,16 +170,16 @@
return repo.text;
} // 函数用于呈现当前的选择
});
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');
var statusSelect = $("#statusSelect").select2({
minimumResultsForSearch: 10,
placeholder: '请选择',
}).val('').trigger("change");
statusSelect.on("change", function (e) {
}).val('').trigger("change.select2");
statusSelect.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
$("#table").bootstrapTable({ // 对应table标签的id

View File

@ -174,8 +174,8 @@
return repo.text;
} // 函数用于呈现当前的选择
});
selelct_.val("").trigger("change");
selelct_.on("change", function (e) {
selelct_.val("").trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');

View File

@ -354,7 +354,7 @@
</div>--%>
<div class="form-group" style="margin:8px">
<button type="button" class="btn btn-default btn-file" onclick="fileinputPic('maintenanceDetailFile')"
<button type="button" class="btn btn-default btn-file" onclick="fileinputPic('abnormityFileId')"
id="btn_save"><i
class="fa fa-paperclip"></i>上传图片
</button>

View File

@ -187,8 +187,8 @@
return repo.text;
} // 函数用于呈现当前的选择
});
selelct_.val("").trigger("change");
selelct_.on("change", function (e) {
selelct_.val("").trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');

View File

@ -271,8 +271,8 @@
formatResult: function formatRepo(repo) { return repo.text; }, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo) { return repo.text; } // 函数用于呈现当前的选择
});
selelct_.val("").trigger("change");
selelct_.on("change", function (e) {
selelct_.val("").trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');

View File

@ -72,6 +72,18 @@
}).on('hide', function (e) {
$('#subForm').data('bootstrapValidator').updateStatus('rptdtM_Start', 'NOT_VALIDATED', null).validateField('rptdtM_Start');
});
$('#rptdtQ_Start').datepicker({
changeYear: true,
changeMonth: true,
format: 'yyyy-mm',
language: "zh-CN",
autoclose: true,
startView: 1,
minViewMode: 1,
maxViewMode: 2,
}).on('hide', function (e) {
$('#subForm').data('bootstrapValidator').updateStatus('rptdtQ_Start', 'NOT_VALIDATED', null).validateField('rptdtQ_Start');
});
$('#rptdtY_Start').datepicker({
format: 'yyyy',
language: "zh-CN",
@ -105,6 +117,18 @@
}).on('hide', function (e) {
$('#subForm').data('bootstrapValidator').updateStatus('rptdtM_End', 'NOT_VALIDATED', null).validateField('rptdtM_End');
});
$('#rptdtQ_End').datepicker({
changeYear: true,
changeMonth: true,
format: 'yyyy-mm',
language: "zh-CN",
autoclose: true,
startView: 1,
minViewMode: 1,
maxViewMode: 2,
}).on('hide', function (e) {
$('#subForm').data('bootstrapValidator').updateStatus('rptdtQ_End', 'NOT_VALIDATED', null).validateField('rptdtQ_End');
});
$('#rptdtY_End').datepicker({
format: 'yyyy',
language: "zh-CN",
@ -146,6 +170,8 @@
value="${dateD}">
<input type="text" class="form-control" id="rptdtM_Start" name="rptdt_start" style="width: 132px;"
value="${dateM}">
<input type="text" class="form-control" id="rptdtQ_Start" name="rptdt_start" style="width: 132px;"
value="${dateQ}">
<input type="text" class="form-control" id="rptdtY_Start" name="rptdt_start" style="width: 132px;"
value="${dateY}">
</div>
@ -160,6 +186,8 @@
value="${dateD}">
<input type="text" class="form-control" id="rptdtM_End" name="rptdt_end" style="width: 132px;"
value="${dateM}">
<input type="text" class="form-control" id="rptdtQ_End" name="rptdt_end" style="width: 132px;"
value="${dateQ}">
<input type="text" class="form-control" id="rptdtY_End" name="rptdt_end" style="width: 132px;"
value="${dateY}">
</div>

File diff suppressed because it is too large Load Diff

View File

@ -129,11 +129,17 @@
};
var deletesFun = function () {
var checkedItems = $("#table").bootstrapTable('getSelections');
var datas = "";
var ids = [];
var staffIds = [];
$.each(checkedItems, function (index, item) {
datas += item.id + ",";
if (item.id) {
ids.push(item.id);
} else if (item.staffId) {
// 兼容模式若后续行模型提供备用ID批删也可工作
staffIds.push(item.staffId);
}
});
if (datas == "") {
if (ids.length === 0 && staffIds.length === 0) {
showAlert('d', '请先选择记录', 'mainAlertdiv');
} else {
swal({
@ -157,7 +163,10 @@
}
}).then(function (willDelete) {
if (willDelete) {
$.post(ext.contextPath + '/safety/internalCertificate/deletes.do', {ids: datas}, function (data) {
$.post(ext.contextPath + '/safety/internalCertificate/deletes.do', {
ids: ids.join(","),
staffIds: staffIds.join(",")
}, function (data) {
if (data > 0) {
$("#table").bootstrapTable('refresh');
// 初始化 作业类型
@ -313,17 +322,17 @@
field: 'jobType', // 返回json数据中的name
title: '作业类型', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
valign: 'middle' // 上下居中
}, {
field: 'issuingAuthority', // 返回json数据中的name
title: '发证机构', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
valign: 'middle' // 上下居中
}, {
field: 'issueDate', // 返回json数据中的name
title: '领证时间', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
valign: 'middle' // 上下居中
}, {
field: 'expirationDate', // 返回json数据中的name
title: '有效期至', // 表格表头显示文字

View File

@ -16,16 +16,10 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
.form-horizontal {
padding-top: 20px;
}
.DDD{
list-style: none;
line-height: 30px;
}
</style>
<script type="text/javascript">
var fileList = []
// 初始化
$(function () {
$('#test').outerHTML = initFileInputView()
//初始化 检查日期
$("#checkDate").datepicker({
language: 'zh-CN',
@ -45,7 +39,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
}
});
// 初始化提交按钮
// 初始化'提交'按钮
$("#submitBt").hide();
$("#checkResult").change(function () {
var type = $("#checkResult option:selected").val();
@ -72,37 +66,11 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
// 初始化 检查项目下拉
checkItemDropDownInit()
// 初始化 附件列表
initFileList();
});
// 点击文件
var fileinput = function () {
$('#file').click();
};
// 清空文件
var filedel = function () {
fileList.splice(index,1)
$('#test').html(initFileInputView())
};
// 选中文件
var fileSelected = function () {
var filename = $('#file').val();
fileList.push(...$('#file')[0].files)
$('#test').html(initFileInputView())
};
function initFileInputView() {
let button = (index) => {
return `<button type="button" class="btn btn-default btn-file" onclick="filedel(`+index+`)"
style="position: fixed;right: 193px;height: 24px;width:24px;padding-top:2px;margin-top: 3px" id="btn_save1"><i class="fa fa-trash-o" style="margin-left: -5px"></i></button>`
}
let temp = `<ul class="DDD">`
fileList.forEach((item, index) => {
temp += `<li>`+item.name+button(index)+`</li>`
})
temp += `<ul>`
temp += `<input type="hidden" class="form-control" name="fileName" id="fileName" readonly
style="width:650px;border:none;background-color: white"/>`
return temp
}
// 处理 检查类型 前缀拼接
function handleCheckType(formData) {
let checktype = $('input[type=radio][name=checkType]:checked').val();
@ -112,6 +80,19 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
}
}
// 加载附件
function initFileList() {
// SAFETY_CHECK_COMPREHENSIVE(9, "综合安全检查","ZH"),
$.post(ext.contextPath + '/safety/SafetyFiles/fileListShow.do',
{
bizId: '${preId}',
functionCode: 9,
statusCode: 1
}, function (data) {
$("#fileList").html(data);
});
};
// 保存
function saveFun() {
$("#addForm").bootstrapValidator('validate');//提交验证
@ -128,7 +109,6 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
processData: false,
dataType: 'json',
success: function (data) {
// console.log(data)
if (data.code == 1) {
$("#table").bootstrapTable('refresh');
closeModal('subModal');
@ -303,6 +283,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
<!-- 新增界面formid强制为addForm -->
<form class="form-horizontal" id="addForm" enctype="multipart/form-data">
<div id="alertDiv"></div>
<input type="hidden" class="form-control" id="id" name="id" value="${preId}"/>
<div class="form-group">
<label class="col-sm-2 control-label">检查类型</label>
@ -415,26 +396,12 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label ">附件资料:</label>
<div class="col-sm-1" style="display: flex">
<button type="button" class="btn btn-default btn-file" onclick="fileinput()"
id="btn_save"><i class="fa fa-paperclip"></i></button>
</div>
<div class="col-sm-7">
<div id="test" ></div>
</div>
</div>
<div class="form-group" style="margin:8px;">
<input type="file" name="file" id="file" multiple class="file-loading"
onchange="fileSelected()"/>
<div class="form-group" style="margin-left: 20px">
<div class="col-sm-10" id="fileList"></div>
</div>
</form>
</div>
<div class="modal-foo
ter">
<div class="modal-footer">
<button type="button" class="btn btn-default " data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary " style="margin-left: 10px" onclick="saveFun()">
保存

View File

@ -400,7 +400,17 @@
//导出
function downloadExcelFun() {
window.open(ext.contextPath + "/sparepart/sewage/downloadExcelFun.do");
var checkedItems = $("#table").bootstrapTable('getSelections');
var ids = "";
$.each(checkedItems, function(index, item){
ids += item.id + ",";
});
if(ids !== ""){
ids = ids.substring(0, ids.length - 1);
window.open(ext.contextPath + "/sparepart/sewage/downloadExcelFun.do?ids=" + encodeURIComponent(ids));
}else{
window.open(ext.contextPath + "/sparepart/sewage/downloadExcelFun.do");
}
}
</script>
</head>

View File

@ -113,7 +113,7 @@ var selectMPint = function(pid) {
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
if(data!=null && data.length>0){
selelct_.val(data[0].id).trigger("change");
selelct_.val(data[0].id).trigger("change.select2");
}
},'json');
}else{
@ -131,8 +131,8 @@ var selectMPint = function(pid) {
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct.val('').trigger("change");
selelct.on("change",function(e){
selelct.val('').trigger("change.select2");
selelct.off("select2:select select2:clear").on("select2:select select2:clear",function(){
var companyId= $(this).val();
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processsectionid").empty();
@ -147,7 +147,7 @@ var selectMPint = function(pid) {
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct_.val('${kPIPoint.processsectionid}').trigger("change");
selelct_.val('${kPIPoint.processsectionid}').trigger("change.select2");
},'json');
});
}

View File

@ -89,7 +89,7 @@ var selectMPint = function(pid) {
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct_.val('${kPIPoint.processsectionid}').trigger("change");
selelct_.val('${kPIPoint.processsectionid}').trigger("change.select2");
},'json');
};
@ -116,7 +116,7 @@ var selectMPint = function(pid) {
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct_.val('${kPIPoint.processsectionid}').trigger("change");
selelct_.val('${kPIPoint.processsectionid}').trigger("change.select2");
},'json');
}else{
$("#hidden_bizid").attr("disabled","disabled");
@ -133,8 +133,8 @@ var selectMPint = function(pid) {
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct.val('${kPIPoint.bizid}').trigger("change");
selelct.on("change",function(e){
selelct.val('${kPIPoint.bizid}').trigger("change.select2");
selelct.off("select2:select select2:clear").on("select2:select select2:clear",function(){
var companyId= $(this).val();
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processsectionid").empty();
@ -149,7 +149,7 @@ var selectMPint = function(pid) {
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct_.val('').trigger("change");
selelct_.val('').trigger("change.select2");
},'json');
});
}

View File

@ -1,406 +1,435 @@
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ page import="com.sipai.entity.base.ServerObject"%>
<%@ taglib uri="http://www.springsecurity.org/jsp" prefix="security"%>
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page import="com.sipai.entity.base.ServerObject" %>
<%@ taglib uri="http://www.springsecurity.org/jsp" prefix="security" %>
<!DOCTYPE html>
<!-- <html lang="zh-CN"> -->
<!-- BEGIN HEAD -->
<head>
<title><%= ServerObject.atttable.get("TOPTITLE")%></title>
<title><%= ServerObject.atttable.get("TOPTITLE")%>
</title>
<!-- 引用页头及CSS页-->
<jsp:include page="/jsp/inc.jsp"></jsp:include>
<style type="text/css">
.select2-container .select2-selection--single{
height:34px;
line-height: 34px;
}
.select2-selection__arrow{
margin-top:3px;
}
</style>
<script type="text/javascript">
var companyId = "";
var showMaintenanceList = function(id) {
$.post(ext.contextPath + '/maintenance/showMaintenanceList4Equipment.do', {equipmentId:id} , function(data) {
$("#subDiv").html(data);
openModal('subMaintenanceModal');
});
};
var showHandleDetailList = function(id) {
stopBubbleDefaultEvent();
$.post(ext.contextPath + '/maintenance/showHandleDetailList4Equipment.do', {equipmentId:id} , function(data) {
$("#subDiv").html(data);
openModal('handleDetailModal');
});
};
var viewEquipmentFun = function(equipmentName,equipmentCardID,id) {
$.post(ext.contextPath + '/equipment/viewEquipmentCard.do', {equipmentName:equipmentName,equipmentCardID:equipmentCardID,id:id} , function(data) {
$("#subEquipmentDiv").html(data);
openModal('subEquipmentModal');
});
};
<!-- 引用页头及CSS页-->
<jsp:include page="/jsp/inc.jsp"></jsp:include>
<style type="text/css">
.select2-container .select2-selection--single {
height: 34px;
line-height: 34px;
}
var addFun = function() {
$.post(ext.contextPath + '/work/kpipoint/add.do', {} , function(data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
.select2-selection__arrow {
margin-top: 3px;
}
</style>
<script type="text/javascript">
var companyId = "";
var showMaintenanceList = function (id) {
$.post(ext.contextPath + '/maintenance/showMaintenanceList4Equipment.do', {equipmentId: id}, function (data) {
$("#subDiv").html(data);
openModal('subMaintenanceModal');
});
};
var showHandleDetailList = function (id) {
stopBubbleDefaultEvent();
$.post(ext.contextPath + '/maintenance/showHandleDetailList4Equipment.do', {equipmentId: id}, function (data) {
$("#subDiv").html(data);
openModal('handleDetailModal');
});
};
var viewEquipmentFun = function (equipmentName, equipmentCardID, id) {
$.post(ext.contextPath + '/equipment/viewEquipmentCard.do', {
equipmentName: equipmentName,
equipmentCardID: equipmentCardID,
id: id
}, function (data) {
$("#subEquipmentDiv").html(data);
openModal('subEquipmentModal');
});
};
var editFun = function(id) {
stopBubbleDefaultEvent();
$.post(ext.contextPath + '/work/kpipoint/edit.do', {id:id} , function(data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var addFun = function () {
$.post(ext.contextPath + '/work/kpipoint/add.do', {}, function (data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var viewFun = function(id){
$.post(ext.contextPath + '/work/kpipoint/view.do', {id:id} , function(data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var editFun = function (id) {
stopBubbleDefaultEvent();
$.post(ext.contextPath + '/work/kpipoint/edit.do', {id: id}, function (data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var viewFun = function (id) {
$.post(ext.contextPath + '/work/kpipoint/view.do', {id: id}, function (data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var deleteFun = function (id) {
stopBubbleDefaultEvent();
swal({
text: "您确定要删除此记录?",
dangerMode: true,
buttons: {
cancel: {
text: "取消",
value: null,
visible: true,
className: "btn btn-default btn-sm",
closeModal: true,
},
confirm: {
text: "确定",
value: true,
visible: true,
className: "btn btn-danger btn-sm",
closeModal: true
}
}
})
.then(function (willDelete) {
if (willDelete) {
$.post(ext.contextPath + '/work/kpipoint/delete.do', {id: id}, function (data) {
if (data == 1) {
$("#table").bootstrapTable('refresh');
} else {
showAlert('d', '删除失败', 'mainAlertdiv');
}
});
var deleteFun = function(id) {
stopBubbleDefaultEvent();
swal({
text: "您确定要删除此记录?",
dangerMode: true,
buttons: {
cancel: {
text: "取消",
value: null,
visible: true,
className: "btn btn-default btn-sm",
closeModal: true,
},
confirm: {
text: "确定",
value: true,
visible: true,
className: "btn btn-danger btn-sm",
closeModal: true
}
}
})
.then(function(willDelete) {
if (willDelete) {
$.post(ext.contextPath + '/work/kpipoint/delete.do', {id : id}, function(data) {
if(data==1){
$("#table").bootstrapTable('refresh');
}else{
showAlert('d','删除失败','mainAlertdiv');
}
});
};
//删除多条资产类型数据
var deletesFun = function () {
var checkedItems = $("#table").bootstrapTable('getSelections');
var datas = "";
$.each(checkedItems, function (index, item) {
datas += item.id + ",";
});
if (datas == "") {
showAlert('d', '请先选择记录', 'mainAlertdiv');
} else {
swal({
text: "您确定要删除此记录?",
dangerMode: true,
buttons: {
cancel: {
text: "取消",
value: null,
visible: true,
className: "btn btn-default btn-sm",
closeModal: true,
},
confirm: {
text: "确定",
value: true,
visible: true,
className: "btn btn-danger btn-sm",
closeModal: true
}
}
})
.then(function (willDelete) {
if (willDelete) {
$.post(ext.contextPath + '/work/kpipoint/deletes.do', {ids: datas}, function (data) {
if (data > 0) {
$("#table").bootstrapTable('refresh');
} else {
showAlert('d', '删除失败', 'mainAlertdiv');
}
});
}
});
};
//删除多条资产类型数据
var deletesFun = function() {
var checkedItems = $("#table").bootstrapTable('getSelections');
var datas="";
$.each(checkedItems, function(index, item){
datas+=item.id+",";
});
if(datas==""){
showAlert('d','请先选择记录','mainAlertdiv');
}else{
swal({
text: "您确定要删除此记录?",
dangerMode: true,
buttons: {
cancel: {
text: "取消",
value: null,
visible: true,
className: "btn btn-default btn-sm",
closeModal: true,
},
confirm: {
text: "确定",
value: true,
visible: true,
className: "btn btn-danger btn-sm",
closeModal: true
}
}
})
.then(function(willDelete) {
if (willDelete) {
$.post(ext.contextPath + '/work/kpipoint/deletes.do', {ids:datas} , function(data) {
if(data>0){
$("#table").bootstrapTable('refresh');
}else{
showAlert('d','删除失败','mainAlertdiv');
}
});
}
});
}
};
var dosearch = function() {
$("#table").bootstrapTable('refresh');
};
var refreshSelect = function() {
var selelct_ =$("#processSection").select2({
data: null,
placeholder:'请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
$("#processSection").empty();
// $("#table").bootstrapTable('refresh', {data:null});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
};
}
});
}
};
var dosearch = function () {
$("#table").bootstrapTable('refresh');
};
var loadProcessSectionSelect = function (bizId) {
if (!bizId) {
refreshSelect();
return;
}
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId: bizId}, function (data) {
$("#processSection").empty();
var selelct_ = $("#processSection").select2({
data: data,
cache: false,
placeholder: '请选择',
allowClear: true,
escapeMarkup: function (markup) {
return markup;
},
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,
formatResult: function formatRepo(repo) {
return repo.text;
},
formatSelection: function formatRepoSelection(repo) {
return repo.text;
}
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'});
// 初始化时仅刷新控件显示,不触发查询
selelct_.val('').trigger("change.select2");
// 用select2事件触发查询避免普通change导致选中文本被立即重置
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function () {
// 让select2先完成渲染再执行查询
setTimeout(function () {
dosearch();
}, 0);
});
}, 'json');
};
var refreshSelect = function () {
var selelct_ = $("#processSection").select2({
data: null,
placeholder: '请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) {
return markup;
}, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
$("#processSection").empty();
// $("#table").bootstrapTable('refresh', {data:null});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
};
$(function() {
$.post(ext.contextPath + "/user/getSearchBizsByUserId4Select.do", {}, function(data) {
if(data.length == 1){
//选择厂区为一个厂时隐藏选择框
$("#search_code").css("display", "none");
$("#company").text(data[0].text);
companyId=data[0].id;
dosearch();
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processSection").empty();
var selelct_ =$("#processSection").select2({
$(function () {
$.post(ext.contextPath + "/user/getSearchBizsByUserId4Select.do", {}, function (data) {
if (data.length == 1) {
//选择厂区为一个厂时隐藏选择框
$("#search_code").css("display", "none");
$("#company").text(data[0].text);
companyId = data[0].id;
loadProcessSectionSelect(companyId);
dosearch();
} else {
// 当前页面可能不展示厂区下拉search_code被注释兜底按当前厂区/首个厂区加载工艺段
if ($("#search_code").length == 0) {
companyId = (typeof unitId !== "undefined" && unitId) ? unitId : data[0].id;
loadProcessSectionSelect(companyId);
dosearch();
return;
}
$("#company").css("display", "none");
var selelct = $("#search_code").select2({
data: data,
cache : false,
placeholder:'请选择',//默认文字提示
placeholder: '请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入
escapeMarkup: function (markup) {
return markup;
}, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
dosearch();
});
},'json');
}else{
$("#company").css("display", "none");
var selelct=$("#search_code").select2({
data : data ,
placeholder:'请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct.val('').trigger("change");
refreshSelect();
selelct.on("change",function(e){
companyId= $(this).val();
dosearch();
refreshSelect();
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processSection").empty();
var selelct_ =$("#processSection").select2({
data: data,
cache : false,
placeholder:'请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
dosearch();
});
},'json');
});
}
},'json');
$("#table").bootstrapTable({ // 对应table标签的id
url: ext.contextPath + '/work/kpipoint/getlist.do', // 获取表格数据的url
cache: false, // 设置为 false 禁用 AJAX 数据缓存, 默认为true
striped: true, //表格显示条纹默认为false
pagination: true, // 在表格底部显示分页组件默认false
pageList: [10, 20,50], // 设置页面可以显示的数据条数
pageSize: 50, // 页面数据条数
pageNumber: 1, // 首页页码
sidePagination: 'server', // 设置为服务器端分页
queryParams: function (params) { // 请求服务器数据时发送的参数可以在这里添加额外的查询参数返回false则终止请求
return {
rows: params.limit, // 每页要显示的数据条数
page: params.offset/params.limit+1, // 每页显示数据的开始页码
sort: params.sort, // 要排序的字段
order: params.order,
search_name : $('#search_name').val(),
companyId: unitId,
pSectionId: $("#processSection").val(),
formatResult: function formatRepo(repo) {
return repo.text;
}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo) {
return repo.text;
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct.val('').trigger("change.select2");
refreshSelect();
selelct.off("select2:select select2:clear").on("select2:select select2:clear", function () {
companyId = $(this).val();
dosearch();
refreshSelect();
loadProcessSectionSelect(companyId);
});
}
},
sortName: 'grade', // 要排序的字段
sortOrder: 'asc', // 排序规则
onClickRow: function (row) {//单击行事件,执行查看功能
viewFun(row.id);
},
columns: [
{
checkbox: true, // 显示一个勾选框
},{
field: 'mpointid', // 返回json数据中的name
title: '测量点编号', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
},{
field: 'mpointname', // 返回json数据中的name
title: '测量点名称', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
},{
field: 'bizid', // 返回json数据中的name
title: '所属厂区', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
},{
field: 'processectionname', // 返回json数据中的name
title: '工艺段', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
},{
field: 'grade', // 返回json数据中的name
title: '重要等级', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle'
},{
title: "操作",
align: 'center',
valign: 'middle',
width: 120, // 定义列的宽度单位为像素px
formatter: function (value, row, index) {
var buts="";
buts+= '<security:authorize buttonUrl="work/scadaPic/edit.do">';
buts+= '<button class="btn btn-default btn-sm" title="编辑" onclick="editFun(\'' + row.id + '\')"><i class="fa fa-edit"></i><span class="hidden-md hidden-lg"> 编辑</span></button>';
buts+= '</security:authorize>';
}, 'json');
buts+= '<security:authorize buttonUrl="work/scadaPic/delete.do">';
buts+='<button class="btn btn-default btn-sm" title="删除" onclick="deleteFun(\''+row.id+'\')"><i class="fa fa fa-trash-o"></i><span class="hidden-md hidden-lg">删除</span></button';
buts+= '</security:authorize>';
buts='<div class="btn-group" >'+buts+'</div>';
return buts;
$("#table").bootstrapTable({ // 对应table标签的id
url: ext.contextPath + '/work/kpipoint/getlist.do', // 获取表格数据的url
cache: false, // 设置为 false 禁用 AJAX 数据缓存, 默认为true
striped: true, //表格显示条纹默认为false
pagination: true, // 在表格底部显示分页组件默认false
pageList: [10, 20, 50], // 设置页面可以显示的数据条数
pageSize: 50, // 页面数据条数
pageNumber: 1, // 首页页码
sidePagination: 'server', // 设置为服务器端分页
queryParams: function (params) { // 请求服务器数据时发送的参数可以在这里添加额外的查询参数返回false则终止请求
return {
rows: params.limit, // 每页要显示的数据条数
page: params.offset / params.limit + 1, // 每页显示数据的开始页码
sort: params.sort, // 要排序的字段
order: params.order,
search_name: $('#search_name').val(),
companyId: companyId,
pSectionId: $("#processSection").val(),
}
},
sortName: 'grade', // 要排序的字段
sortOrder: 'asc', // 排序规则
onClickRow: function (row) {//单击行事件,执行查看功能
viewFun(row.id);
},
columns: [
{
checkbox: true, // 显示一个勾选框
}, {
field: 'mpointid', // 返回json数据中的name
title: '测量点编号', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'mpointname', // 返回json数据中的name
title: '测量点名称', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'bizid', // 返回json数据中的name
title: '所属厂区', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'processectionname', // 返回json数据中的name
title: '工艺段', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'grade', // 返回json数据中的name
title: '重要等级', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle'
}, {
title: "操作",
align: 'center',
valign: 'middle',
width: 120, // 定义列的宽度单位为像素px
formatter: function (value, row, index) {
var buts = "";
buts += '<security:authorize buttonUrl="work/scadaPic/edit.do">';
buts += '<button class="btn btn-default btn-sm" title="编辑" onclick="editFun(\'' + row.id + '\')"><i class="fa fa-edit"></i><span class="hidden-md hidden-lg"> 编辑</span></button>';
buts += '</security:authorize>';
buts += '<security:authorize buttonUrl="work/scadaPic/delete.do">';
buts += '<button class="btn btn-default btn-sm" title="删除" onclick="deleteFun(\'' + row.id + '\')"><i class="fa fa fa-trash-o"></i><span class="hidden-md hidden-lg">删除</span></button';
buts += '</security:authorize>';
buts = '<div class="btn-group" >' + buts + '</div>';
return buts;
}
}
],
onLoadSuccess: function () { //加载成功时执行
adjustBootstrapTableView("table");
},
onLoadError: function () { //加载失败时执行
console.info("加载数据失败");
}
],
onLoadSuccess: function(){ //加载成功时执行
adjustBootstrapTableView("table");
},
onLoadError: function(){ //加载失败时执行
console.info("加载数据失败");
}
})
})
});
</script>
});
</script>
</head>
<body onload="initMenu()" class="hold-transition ${cu.themeclass} sidebar-mini">
<div class="wrapper">
<!-- 引用top -->
<%-- <jsp:include page="/jsp/top.jsp"></jsp:include> --%>
<!-- 菜单栏 -->
<%-- <jsp:include page="/jsp/left.jsp"></jsp:include> --%>
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1 id ="head_title"></h1>
<ol class="breadcrumb">
<li><a id ='head_firstlevel' href="#"><i class="fa fa-dashboard"></i> </a></li>
<!-- <li class="active">Here</li> -->
</ol>
</section>
<!-- Main content -->
<section class="content container-fluid">
<div id="mainAlertdiv"></div>
<div id="subDiv"></div>
<div id="mpSubDiv"></div>
<div >
<!-- <div class="form-group">
<label class="form-label" id="companylabel">水厂:</label>
<label class="form-label" id="company" style="width:180px;border: none;background: transparent;" ></label>
<select class="form-control select2 " id="search_code" name ="search_code" style="width: 220px;"></select>
</div> -->
<div class="form-group form-inline" style="padding:0;">
<div class="wrapper">
<!-- 引用top -->
<%-- <jsp:include page="/jsp/top.jsp"></jsp:include> --%>
<!-- 菜单栏 -->
<%-- <jsp:include page="/jsp/left.jsp"></jsp:include> --%>
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1 id="head_title"></h1>
<ol class="breadcrumb">
<li><a id='head_firstlevel' href="#"><i class="fa fa-dashboard"></i> </a></li>
<!-- <li class="active">Here</li> -->
</ol>
</section>
<!-- Main content -->
<section class="content container-fluid">
<div id="mainAlertdiv"></div>
<div id="subDiv"></div>
<div id="mpSubDiv"></div>
<div>
<!-- <div class="form-group">
<label class="form-label" id="companylabel">水厂:</label>
<label class="form-label" id="company" style="width:180px;border: none;background: transparent;" ></label>
<select class="form-control select2 " id="search_code" name ="search_code" style="width: 220px;"></select>
</div> -->
<div class="form-group form-inline" style="padding:0;">
<div class="form-group form-inline">
<div class="form-group form-inline">
<div class="form-group form-inline">
<div class="btn-group" style="width: 220px;padding-bottom:10px;">
<security:authorize buttonUrl="work/scadaPic/add.do">
<button type="button" class="btn btn-default btn-sm" onclick="addFun();"><i class="fa fa-plus"></i> 新增</button>
<button type="button" class="btn btn-default btn-sm" onclick="deletesFun();"><i class="fa fa-trash-o"></i> 删除</button>
</security:authorize>
</div>
</div>
</div>
<div class="form-group pull-right" >
<div class="input-group input-group-sm" style="width: 250px;">
<input type="text" id="search_name" name="search_name" class="form-control pull-right" placeholder="编号">
<div class="input-group-btn">
<button class="btn btn-default" onclick="dosearch();"><i class="fa fa-search"></i></button>
</div>
<div class="btn-group" style="width: 220px;padding-bottom:10px;">
<security:authorize buttonUrl="work/scadaPic/add.do">
<button type="button" class="btn btn-default btn-sm" onclick="addFun();"><i
class="fa fa-plus"></i> 新增
</button>
<button type="button" class="btn btn-default btn-sm" onclick="deletesFun();"><i
class="fa fa-trash-o"></i> 删除
</button>
</security:authorize>
</div>
</div>
<div class="form-group pull-right">
<label class="form-label">工艺段</label>
<select class="form-control select2 " id="processSection" name ="processSection" style="width: 220px;"></select>
</div>
</div>
<table id="table"></table>
<div class="form-group pull-right">
<div class="input-group input-group-sm" style="width: 250px;">
<input type="text" id="search_name" name="search_name" class="form-control pull-right"
placeholder="编号">
<div class="input-group-btn">
<button class="btn btn-default" onclick="dosearch();"><i class="fa fa-search"></i>
</button>
</div>
</div>
</div>
<div class="form-group pull-right">
<label class="form-label">工艺段</label>
<select class="form-control select2 " id="processSection" name="processSection"
style="width: 220px;"></select>
</div>
</div>
<table id="table"></table>
</div>
</section>
<!-- /.content -->
</div>
<%-- <jsp:include page="/jsp/bottom.jsp"></jsp:include> --%>
<%-- <jsp:include page="/jsp/side.jsp"></jsp:include> --%>
</section>
<!-- /.content -->
</div>
<%-- <jsp:include page="/jsp/bottom.jsp"></jsp:include> --%>
<%-- <jsp:include page="/jsp/side.jsp"></jsp:include> --%>
</div>
</body>
<!-- 文件上传-->
<link rel="stylesheet" href="<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/css/fileinput.min.css"/>
<%-- <script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/js/fileinput.min.js" charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/js/locales/zh.js" charset="utf-8"></script> --%>
<script type="text/javascript">
document.write("<scr"+"ipt src=\"<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/js/fileinput.min.js\"></sc"+"ript>")
document.write("<scr"+"ipt src=\"<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/js/locales/zh.js\"></sc"+"ript>")
document.write("<scr" + "ipt src=\"<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/js/fileinput.min.js\"></sc" + "ript>")
document.write("<scr" + "ipt src=\"<%=request.getContextPath()%>/node_modules/bootstrap-fileinput/js/locales/zh.js\"></sc" + "ript>")
</script>
<!-- 引入ChartJS-->
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/chart.js/dist/Chart.min.js" charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/chart.js/dist/Chart.bundle.min.js" charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/chart.js/dist/Chart.min.js"
charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/chart.js/dist/Chart.bundle.min.js"
charset="utf-8"></script>
<!-- 引入daterangepicker-->
<link rel="stylesheet" href="<%=request.getContextPath()%>/plugins/bootstrap-daterangepicker/daterangepicker.css"/>
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/bootstrap-daterangepicker/moment.min.js" charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/bootstrap-daterangepicker/daterangepicker.js" charset="utf-8"></script>
<link rel="stylesheet" href="<%=request.getContextPath()%>/plugins/bootstrap-daterangepicker/daterangepicker.css"/>
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/bootstrap-daterangepicker/moment.min.js"
charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/bootstrap-daterangepicker/daterangepicker.js"
charset="utf-8"></script>
<!-- echarts-->
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/echarts/echarts.js" charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/echarts/macarons.js" charset="utf-8"></script>

View File

@ -139,6 +139,34 @@ var companyId = "";
var dosearch = function() {
$("#table").bootstrapTable('refresh');
};
var loadProcessSectionSelect = function(companyId) {
if (!companyId) {
refreshSelect();
return;
}
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processSection").empty();
var selelct_ =$("#processSection").select2({
data: data,
cache : false,
placeholder:'请选择',
allowClear: true,
escapeMarkup: function (markup) { return markup; },
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,
formatResult: function formatRepo(repo){return repo.text;},
formatSelection: function formatRepoSelection(repo){return repo.text;}
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'});
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear",function(){
setTimeout(function(){
dosearch();
},0);
});
},'json');
};
var refreshSelect = function() {
var selelct_ =$("#processSection").select2({
data: null,
@ -163,27 +191,7 @@ var companyId = "";
$("#company").text(data[0].text);
companyId=data[0].id;
dosearch();
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processSection").empty();
var selelct_ =$("#processSection").select2({
data: data,
cache : false,
placeholder:'请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
dosearch();
});
},'json');
loadProcessSectionSelect(companyId);
}else{
$("#company").css("display", "none");
var selelct=$("#search_code").select2({
@ -198,32 +206,13 @@ var companyId = "";
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct.val('').trigger("change");
selelct.val('').trigger("change.select2");
refreshSelect();
selelct.on("change",function(e){
selelct.off("select2:select select2:clear").on("select2:select select2:clear",function(){
companyId= $(this).val();
dosearch();
refreshSelect();
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId:companyId}, function(data) {
$("#processSection").empty();
var selelct_ =$("#processSection").select2({
data: data,
cache : false,
placeholder:'请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
dosearch();
});
},'json');
loadProcessSectionSelect(companyId);
});
}
},'json');

View File

@ -366,8 +366,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');
@ -394,9 +394,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct.val('').trigger("change");
//refreshSelect();
selelct.on("change", function (e) {
selelct.val('').trigger("change.select2");
selelct.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
companyId = $(this).val();
//dosearch();
//refreshSelect();
@ -422,8 +421,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');

View File

@ -325,8 +325,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');
@ -353,9 +353,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct.val('').trigger("change");
//refreshSelect();
selelct.on("change", function (e) {
selelct.val('').trigger("change.select2");
selelct.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
companyId = $(this).val();
//dosearch();
//refreshSelect();
@ -381,8 +380,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function (e) {
dosearch();
});
}, 'json');

View File

@ -133,8 +133,8 @@
formatSelection: function formatRepoSelection(repo) { return repo.text; } // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({ 'height': '30px', 'paddingTop': '4px' })
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh');
});

View File

@ -149,8 +149,8 @@
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
select.val('').trigger("change");
select.on("change", function (e) {
select.val('').trigger("change.select2");
select.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh');
});
@ -166,8 +166,8 @@
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
select.val("").trigger("change");
select.on("change", function (e) {
select.val("").trigger("change.select2");
select.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh');
});
@ -196,8 +196,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh');
});

View File

@ -181,8 +181,8 @@
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
select.val('').trigger("change");
select.on("change", function (e) {
select.val('').trigger("change.select2");
select.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh', {pageNumber: 1});
});
@ -200,8 +200,8 @@
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
select.val("").trigger("change");
select.on("change", function (e) {
select.val("").trigger("change.select2");
select.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh', {pageNumber: 1});
});
@ -231,8 +231,8 @@
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.val('').trigger("change");
selelct_.on("change", function (e) {
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear", function () {
$("#table").bootstrapTable('refresh', {pageNumber: 1});
});

View File

@ -108,7 +108,7 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
if(data!=null && data.length>0){
selelct_.val(data[0].id).trigger("change");
selelct_.val(data[0].id).trigger("change.select2");
}
},'json');
}else{
@ -126,7 +126,7 @@
formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct.on("change",function(e){
selelct.off("select2:select select2:clear").on("select2:select select2:clear",function(){
companyId= $(this).val();
//重新选择厂区后清空设备和工艺段数据
$("#equipname").val("");
@ -134,7 +134,7 @@
$("#processSectionId").val("");
$("#processectionname").val("");
});
selelct.val('').trigger("change");
selelct.val('').trigger("change.select2");
}
},'json');
@ -149,8 +149,8 @@
.updateStatus('plannedenddt', 'NOT_VALIDATED',null)
.validateField('plannedenddt');
});
$("#active").select2({minimumResultsForSearch: 10}).val('${Active_True}').trigger("change");
$("#maintenanceWay").select2({minimumResultsForSearch: 10}).val('${INTER_MAINTENANCE}').trigger("change");
$("#active").select2({minimumResultsForSearch: 10}).val('${Active_True}').trigger("change.select2");
$("#maintenanceWay").select2({minimumResultsForSearch: 10}).val('${INTER_MAINTENANCE}').trigger("change.select2");
});
//选择设备根据厂区id选择厂内设备
var selectEquipmentCard = function() {

View File

@ -101,7 +101,7 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
if(data!=null && data.length>0){
selelct_.val(data[0].id).trigger("change");
selelct_.val(data[0].id).trigger("change.select2");
}
},'json');
}else{
@ -119,7 +119,7 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
selelct.on("change",function(e){
selelct.off("select2:select select2:clear").on("select2:select select2:clear", function(e){
companyId = $(this).val();
//重新选择厂区后清空设备和工艺段数据
if(companyId != "${maintenanceDetail.companyid}"){
@ -129,10 +129,10 @@
$("#processectionname").val("");
}
});
selelct.val('${maintenanceDetail.companyid}').trigger("change");
selelct.val('${maintenanceDetail.companyid}').trigger("change.select2");
}
},'json');
$("#maintenanceWay").select2({minimumResultsForSearch: 10}).val("${maintenanceDetail.maintenanceWay}").trigger("change");
$("#maintenanceWay").select2({minimumResultsForSearch: 10}).val("${maintenanceDetail.maintenanceWay}").trigger("change.select2");
//选择时间
$('#startDate').datepicker({
language: 'zh-CN',

View File

@ -133,8 +133,8 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear",function(){
dosearch();
});
@ -153,9 +153,9 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct.val('').trigger("change");
selelct.val('').trigger("change.select2");
refreshSelect();
selelct.on("change",function(e){
selelct.off("select2:select select2:clear").on("select2:select select2:clear",function(){
companyId= $(this).val();
dosearch();
refreshSelect();
@ -174,8 +174,8 @@
formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height':'30px','paddingTop':'4px'})
selelct_.val('').trigger("change");
selelct_.on("change",function(e){
selelct_.val('').trigger("change.select2");
selelct_.off("select2:select select2:clear").on("select2:select select2:clear",function(){
dosearch();
});
},'json');

View File

@ -418,17 +418,12 @@
var getExs = function () {
var datas = selectionIds.toString();
if (datas === "") {
showAlert('d', '请选中之后导出', 'mainAlertdiv');
} else {
// window.open(ext.contextPath + "/workorder/workorderDetail/doExportMain.do?ids=" + datas + "&type=maintain");
var params = {
responseType: 'blob',
ids: datas,
type: 'maintain'
};
postExcelFile(params, ext.contextPath + '/workorder/workorderDetail/doExportMain.do');
}
var params = {
responseType: 'blob',
ids: datas,
type: 'maintain'
};
postExcelFile(params, ext.contextPath + '/workorder/workorderDetail/doExportMain.do');
}
function postExcelFile(params, url) { //params是post请求需要的参数url是请求url地址

View File

@ -117,11 +117,7 @@
//金山项目导出(暂时不用)
var getExs_JS = function () {
var datas = selectionIds;
if (datas == 0) {
showAlert('d', '请选中之后导出', 'mainAlertdiv');
} else {
window.open(ext.contextPath + "/workorder/workorderDetail/doExportRepairJS.do?ids=" + datas + "&type=repair");
}
window.open(ext.contextPath + "/workorder/workorderDetail/doExportRepairJS.do?ids=" + datas + "&type=repair");
}
/**
@ -129,16 +125,12 @@
*/
var getExs = function () {
var datas = selectionIds;
if (datas == 0) {
showAlert('d', '请选中之后导出', 'mainAlertdiv');
} else {
var params = {
responseType: 'blob',
ids: datas,
type: 'repair'
};
postExcelFile(params, ext.contextPath + '/workorder/workorderDetail/doExportRepair.do');
}
var params = {
responseType: 'blob',
ids: datas,
type: 'repair'
};
postExcelFile(params, ext.contextPath + '/workorder/workorderDetail/doExportRepair.do');
}
function postExcelFile(params, url) { //params是post请求需要的参数url是请求url地址