l
chenfeng 7 months ago
parent 11c2c6d215
commit 78564c096c
  1. 2
      src/main/java/com/cjy/back/ybsjAppointment/dao/YbsjyAppointmentRecordMapper.java
  2. 12
      src/main/java/com/cjy/back/ybsjAppointment/dao/YbsjyAppointmentRecordMapper.xml
  3. 9
      src/main/java/com/cjy/back/ybsjAppointment/entity/vo/AppointmentDocumentsDetails.java
  4. 101
      src/main/java/com/cjy/back/ybsjAppointment/service/impl/YbsjyAppointmentRecordImpl.java
  5. 4
      src/main/java/com/cjy/back/ybsjAppointment/service/impl/YbsjyAppointmentSettingServiceImpl.java
  6. 233
      src/main/java/com/cjy/back/ybsjMessageInfo/controller/YbsjMessageInfoController.java
  7. 4
      src/main/java/com/cjy/back/ybsjMessageInfo/dao/YbsjMessageInfoMapper.xml
  8. 2
      src/main/webapp/html/back/ybsjZdLine/list_ybsjZdLineList.js
  9. 2
      src/main/webapp/html/back/yuyueList/studyReservationRecord.html

@ -63,7 +63,7 @@ public interface YbsjyAppointmentRecordMapper {
* @param userId
* @return
*/
int updateAppointmentPeopleInfo(@Param("id") Long id, @Param("userId") String userId);
int updateAppointmentPeopleInfo(@Param("ids") List<String> ids, @Param("userId") String userId);
/**
* 获取预约单信息

@ -33,7 +33,11 @@
set write_off=3,
update_by=#{userId},
update_time= NOW()
where appointment_documents_id = #{id} and write_off=0
where id in
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
and write_off in (0,4)
</update>
<update id="updateAppointmentRecordSate">
update ybsj_appointment_people_info
@ -169,7 +173,9 @@
(SELECT GROUP_CONCAT(cnm.dicname)
FROM sys_dictionary cnm
WHERE FIND_IN_SET(cnm.dicnum, t1.visit_types)
AND dicpcode = 58) visitingPlace
AND dicpcode = 58) visitingPlace,
t1.id,
t1.appointment_type_id
FROM ybsj_appointment_documents_info t1
LEFT JOIN ybsj_scenic_info t2 on t1.scenic_id = t2.guid
LEFT JOIN ybsj_appointment_time_info t3 on t1.appointment_time_info_id = t3.id
@ -352,7 +358,7 @@
AND frequency &lt; 3
</select>
<select id="getAppointmentPeopleIdByDocumentsId" resultType="java.lang.String">
select id from ybsj_appointment_people_info where appointment_documents_id = #{id} and write_off=0
select id from ybsj_appointment_people_info where appointment_documents_id = #{id} and write_off in (0,4)
</select>
<select id="getWriteOffStatusQuantity" resultType="java.util.Map">
SELECT

@ -40,6 +40,15 @@ public class AppointmentDocumentsDetails {
private String writeOffName;
//预约时间ID
private Integer appointmentTimeInfoId;
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAppointmentTimeInfoId() {
return appointmentTimeInfoId;

@ -4,10 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.cjy.back.ybsjAppointment.dao.YbsjyAppointmentRecordMapper;
import com.cjy.back.ybsjAppointment.dao.YbsjyAppointmentSettingMapper;
import com.cjy.back.ybsjAppointment.entity.AppointmentRequestTurnstileLogEntity;
import com.cjy.back.ybsjAppointment.entity.vo.AppointmentDocumentsDetails;
import com.cjy.back.ybsjAppointment.entity.vo.AppointmentPersonVO;
import com.cjy.back.ybsjAppointment.entity.vo.GetAppointmentRecordVO;
import com.cjy.back.ybsjAppointment.entity.vo.WriteOffVo;
import com.cjy.back.ybsjAppointment.entity.vo.*;
import com.cjy.back.ybsjAppointment.service.YbsjyAppointmentRecordService;
import com.cjy.back.ybsjAppointment.utils.Encryption;
import com.cjy.back.ybsjAppointment.utils.IdProduceUtil;
@ -31,6 +28,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -51,7 +49,8 @@ public class YbsjyAppointmentRecordImpl implements YbsjyAppointmentRecordService
private String synchronousCancelDataUrl;
@Value("${encryptionRule}")
private String rule;
@Value("${jqzhgk.scjSynchronousWriteOffData}")
private String scjSynchronousWriteOffData;
/**
* 查询预约记录
*
@ -128,20 +127,41 @@ public class YbsjyAppointmentRecordImpl implements YbsjyAppointmentRecordService
List<String> appointmentPeopleIds = ybsjyAppointmentRecordMapper.getAppointmentPeopleIdByDocumentsId(id);
//第二步修改预约单下人的状态
//通过单号获取到所有取消的数据id
ybsjyAppointmentRecordMapper.updateAppointmentPeopleInfo(id, userId + "");
String responseString = HttpUtil.sendPostJson(synchronousCancelDataUrl, JSONObject.toJSONString(appointmentPeopleIds));
JSONObject responseJson = JSONObject.parseObject(responseString);
//记录访问日志
AppointmentRequestTurnstileLogEntity appointmentRequestTurnstileLogEntity = new AppointmentRequestTurnstileLogEntity();
appointmentRequestTurnstileLogEntity.setRequestUrl(synchronousCancelDataUrl);
appointmentRequestTurnstileLogEntity.setRequestParams(JSONObject.toJSONString(appointmentPeopleIds));
appointmentRequestTurnstileLogEntity.setResponseBody(responseString);
appointmentRequestTurnstileLogEntity.setState(responseJson.get("code").toString());
appointmentRequestTurnstileLogEntity.setType("post");
ybsjyAppointmentSettingMapper.saveAppointmentRequestTurnstileLog(appointmentRequestTurnstileLogEntity);
ybsjyAppointmentRecordMapper.updateAppointmentPeopleInfo(appointmentPeopleIds, userId + "");
AppointmentDocumentsDetails appointmentDocumentsDetails = ybsjyAppointmentRecordMapper.getAppointmentDocumentsInfo(id);
if (appointmentDocumentsDetails.getAppointmentTypeId() != 5701) {
// 更新景区管控数据
List<SynchronousWriteOffDataVO> synchronousWriteOffDataVOS = new ArrayList<>();
//核销人ID
SynchronousWriteOffDataVO synchronousWriteOffDataVO = new SynchronousWriteOffDataVO();
//核销人ID
synchronousWriteOffDataVO.setBookingCategory(2);
synchronousWriteOffDataVO.setWriteOff("3");
synchronousWriteOffDataVO.setDocumentsId(appointmentDocumentsDetails.getId().toString());
synchronousWriteOffDataVOS.add(synchronousWriteOffDataVO);
String responseString = HttpUtil.sendPostJson(scjSynchronousWriteOffData, JSONObject.toJSONString(synchronousWriteOffDataVOS));
JSONObject responseJson = JSONObject.parseObject(responseString);
//记录访问日志
AppointmentRequestTurnstileLogEntity appointmentRequestTurnstileLogEntity = new AppointmentRequestTurnstileLogEntity();
appointmentRequestTurnstileLogEntity.setRequestUrl(synchronousCancelDataUrl);
appointmentRequestTurnstileLogEntity.setRequestParams(JSONObject.toJSONString(appointmentPeopleIds));
appointmentRequestTurnstileLogEntity.setResponseBody(responseString);
appointmentRequestTurnstileLogEntity.setState(responseJson.get("code").toString());
appointmentRequestTurnstileLogEntity.setType("post");
ybsjyAppointmentSettingMapper.saveAppointmentRequestTurnstileLog(appointmentRequestTurnstileLogEntity);
} else {
String responseString = HttpUtil.sendPostJson(synchronousCancelDataUrl, JSONObject.toJSONString(appointmentPeopleIds));
JSONObject responseJson = JSONObject.parseObject(responseString);
//记录访问日志
AppointmentRequestTurnstileLogEntity appointmentRequestTurnstileLogEntity = new AppointmentRequestTurnstileLogEntity();
appointmentRequestTurnstileLogEntity.setRequestUrl(synchronousCancelDataUrl);
appointmentRequestTurnstileLogEntity.setRequestParams(JSONObject.toJSONString(appointmentPeopleIds));
appointmentRequestTurnstileLogEntity.setResponseBody(responseString);
appointmentRequestTurnstileLogEntity.setState(responseJson.get("code").toString());
appointmentRequestTurnstileLogEntity.setType("post");
ybsjyAppointmentSettingMapper.saveAppointmentRequestTurnstileLog(appointmentRequestTurnstileLogEntity);
}
return ServerResponse.createBySuccess("取消成功");
}
@ -162,20 +182,43 @@ public class YbsjyAppointmentRecordImpl implements YbsjyAppointmentRecordService
}
List<String> appointmentPeopleIds = ybsjyAppointmentRecordMapper.getAppointmentPeopleIdByDocumentsId(id);
//第二步修改预约单下人的状态
ybsjyAppointmentRecordMapper.updateAppointmentPeopleInfo(id, unionId);
ybsjyAppointmentRecordMapper.updateAppointmentPeopleInfo(appointmentPeopleIds, unionId);
//通过单号获取到所有取消的数据id
AppointmentDocumentsDetails appointmentDocumentsDetails = ybsjyAppointmentRecordMapper.getAppointmentDocumentsInfo(id);
if (appointmentDocumentsDetails.getAppointmentTypeId() != 5701) {
// 更新景区管控数据
List<SynchronousWriteOffDataVO> synchronousWriteOffDataVOS = new ArrayList<>();
//核销人ID
SynchronousWriteOffDataVO synchronousWriteOffDataVO = new SynchronousWriteOffDataVO();
//核销人ID
synchronousWriteOffDataVO.setBookingCategory(2);
synchronousWriteOffDataVO.setWriteOff("3");
synchronousWriteOffDataVO.setDocumentsId(appointmentDocumentsDetails.getId().toString());
synchronousWriteOffDataVOS.add(synchronousWriteOffDataVO);
String responseString = HttpUtil.sendPostJson(scjSynchronousWriteOffData, JSONObject.toJSONString(synchronousWriteOffDataVOS));
JSONObject responseJson = JSONObject.parseObject(responseString);
//记录访问日志
AppointmentRequestTurnstileLogEntity appointmentRequestTurnstileLogEntity = new AppointmentRequestTurnstileLogEntity();
appointmentRequestTurnstileLogEntity.setRequestUrl(synchronousCancelDataUrl);
appointmentRequestTurnstileLogEntity.setRequestParams(JSONObject.toJSONString(appointmentPeopleIds));
appointmentRequestTurnstileLogEntity.setResponseBody(responseString);
appointmentRequestTurnstileLogEntity.setState(responseJson.get("code").toString());
appointmentRequestTurnstileLogEntity.setType("post");
ybsjyAppointmentSettingMapper.saveAppointmentRequestTurnstileLog(appointmentRequestTurnstileLogEntity);
} else {
String responseString = HttpUtil.sendPostJson(synchronousCancelDataUrl, JSONObject.toJSONString(appointmentPeopleIds));
JSONObject responseJson = JSONObject.parseObject(responseString);
//记录访问日志
AppointmentRequestTurnstileLogEntity appointmentRequestTurnstileLogEntity = new AppointmentRequestTurnstileLogEntity();
appointmentRequestTurnstileLogEntity.setRequestUrl(synchronousCancelDataUrl);
appointmentRequestTurnstileLogEntity.setRequestParams(JSONObject.toJSONString(appointmentPeopleIds));
appointmentRequestTurnstileLogEntity.setResponseBody(responseString);
appointmentRequestTurnstileLogEntity.setState(responseJson.get("code").toString());
appointmentRequestTurnstileLogEntity.setType("post");
ybsjyAppointmentSettingMapper.saveAppointmentRequestTurnstileLog(appointmentRequestTurnstileLogEntity);
String responseString = HttpUtil.sendPostJson(synchronousCancelDataUrl, JSONObject.toJSONString(appointmentPeopleIds));
JSONObject responseJson = JSONObject.parseObject(responseString);
//记录访问日志
AppointmentRequestTurnstileLogEntity appointmentRequestTurnstileLogEntity = new AppointmentRequestTurnstileLogEntity();
appointmentRequestTurnstileLogEntity.setRequestUrl(synchronousCancelDataUrl);
appointmentRequestTurnstileLogEntity.setRequestParams(JSONObject.toJSONString(appointmentPeopleIds));
appointmentRequestTurnstileLogEntity.setResponseBody(responseString);
appointmentRequestTurnstileLogEntity.setState(responseJson.get("code").toString());
appointmentRequestTurnstileLogEntity.setType("post");
ybsjyAppointmentSettingMapper.saveAppointmentRequestTurnstileLog(appointmentRequestTurnstileLogEntity);
}
return ServerResponse.createBySuccess("取消成功");
}

@ -756,13 +756,13 @@ public class YbsjyAppointmentSettingServiceImpl implements YbsjyAppointmentSetti
continue;
}
Cell nameCell = row.getCell(0);
if (nameCell ==null || idCardCell.getCellType() == CellType.BLANK) {
if (nameCell ==null || String.valueOf(nameCell).equals("") || idCardCell.getCellType() == CellType.BLANK) {
System.out.println("第" + (i + 1) + "行,姓名为空。请修改后重新导入。");
errList.add("第" + (i + 1) + "行,姓名为空。请修改后重新导入。");
continue;
}
Cell CellDocuments = row.getCell(2);
if (CellDocuments == null || idCardCell.getCellType() == CellType.BLANK) {
if (CellDocuments == null || String.valueOf(CellDocuments).equals("") || idCardCell.getCellType() == CellType.BLANK) {
System.out.println("第" + (i + 1) + "行,证件类型为空。请修改后重新导入。");
errList.add("第" + (i + 1) + "行,证件类型为空。请修改后重新导入。");
continue;

@ -1,22 +1,36 @@
package com.cjy.back.ybsjMessageInfo.controller;
import com.cjy.back.sysOrgan.entity.SysOrgan;
import com.cjy.back.ybsjAppointment.service.impl.YbsjyAppointmentSettingServiceImpl;
import com.cjy.back.ybsjMessageInfo.entity.YbsjMessageInfo;
import com.cjy.back.ybsjMessageInfo.service.YbsjMessageInfoService;
import com.cjy.util.ServerResponse;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@RestController
@RequestMapping("/messageInfo")
public class YbsjMessageInfoController {
private final static Logger logger = LoggerFactory.getLogger(YbsjMessageInfoController.class);
@Autowired
private YbsjMessageInfoService messageInfoService;
private final String appId = "wx34d91f48f291a4d6";
private final String appSecret = "bc11e97b8e00841053cfc7ba8497c876";
/**
*
@ -143,6 +157,7 @@ public class YbsjMessageInfoController {
*/
@RequestMapping("/saveMessageInfo.do")
public ServerResponse saveMessageInfo(YbsjMessageInfo messageInfo, HttpSession session){
pushMessage(messageInfo);
return messageInfoService.saveMessageInfo(messageInfo,session);
}
@ -159,4 +174,220 @@ public class YbsjMessageInfoController {
return messageInfoService.delMessageInfo(guids,session);
}
/**
* 通知公告推送至微信公众号
*
* @param messageInfo
* @return
*/
@RequestMapping("/pushMessage.do")
public void pushMessage(YbsjMessageInfo messageInfo) {
try {
logger.warn("接收通知公告推送数据" + messageInfo);
//获取token
String accessToken = getAccessToken(appId, appSecret);
logger.warn("获取token" + accessToken);
// 步骤1: 处理内容中的图片
String processedContent = processContent(messageInfo.getContent(), accessToken);
System.out.println("处理后的内容:" + processedContent);
logger.warn("处理后的内容" + processedContent);
// 步骤2: 创建草稿
createDraft(accessToken, messageInfo.getTitle(), processedContent);
} catch (Exception e) {
logger.error("通知公告推送至微信公众号异常:{}",e);
}
}
public String getAccessToken(String appId, String appSecret) throws IOException {
try {
// 目标 URL
URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret);
// 打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方法
conn.setRequestMethod("GET");
// 设置请求头
conn.setRequestProperty("Content-Type", "application/json");
// 获取响应
int responseCode = conn.getResponseCode();
System.out.println("Response Code: " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
JSONObject result = new JSONObject(response.toString());
return result.getString("access_token");
} catch (Exception e) {
logger.error("获取token异常:{}",e);
throw new RuntimeException(e);
}
}
// 1. 下载网络图片(支持自动重试)
private static File downloadImage(String imageUrl) throws IOException, InterruptedException {
File tempFile = File.createTempFile("wx_", ".tmp"); // 先创建临时文件
// 下载文件内容
FileUtils.copyURLToFile(new URL(imageUrl), tempFile);
// 验证文件头
try (InputStream is = new FileInputStream(tempFile)) {
byte[] header = new byte[8];
is.read(header);
// PNG头: 89 50 4E 47 0D 0A 1A 0A
// JPEG头: FF D8 FF
if (!(header[0] == (byte) 0x89 && header[1] == 'P' && header[2] == 'N' && header[3] == 'G') &&
!(header[0] == (byte) 0xFF && header[1] == (byte) 0xD8 && header[2] == (byte) 0xFF)) {
throw new IOException("无效的图片格式");
}
}
return tempFile;
}
// 2. 微信图片上传(修复41005错误)
private static String uploadToWeChat(String accessToken, File file) throws IOException {
String newName ="";
// 1. 验证文件类型
String fileName = file.getName().toLowerCase();
if (!fileName.endsWith(".jpg") && !fileName.endsWith(".jpeg") && !fileName.endsWith(".png")) {
// 重命名临时文件为有效扩展名
newName = fileName.split("\\.")[0] + ".jpg";
File newFile = new File(file.getParent(), newName);
file.renameTo(newFile);
file = newFile;
}
FileInputStream input = new FileInputStream(file);
String url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=" + accessToken + "&type=image";
String boundary = "----WebKitFormBoundary" + System.currentTimeMillis();
String lineEnd = "\r\n";
String twoHyphens = "--";
HttpURLConnection connection = null;
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
OutputStream outputStream = connection.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);
// 添加文件部分
writer.append(twoHyphens + boundary + lineEnd);
writer.append("Content-Disposition: form-data; name=\"media\"; filename=\"" + newName + "\"" + lineEnd);
writer.append("Content-Type: image/*" + lineEnd);
writer.append(lineEnd);
writer.flush();
// 写入文件内容(使用 MultipartFile.getInputStream())
InputStream inputStream = input; // 关键修改点!
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
// 结束部分
writer.append(lineEnd);
writer.append(twoHyphens + boundary + twoHyphens + lineEnd);
writer.close();
// 获取响应
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
JSONObject result = new JSONObject(response.toString());
return result.getString("url");
} else {
throw new IOException("Server returned non-OK status: " + responseCode);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
// 3. 替换内容中的图片链接
private static String processContent(String html, String accessToken) throws Exception {
Pattern pattern = Pattern.compile("<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>");
Matcher matcher = pattern.matcher(html);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
String imgUrl = matcher.group(1);
File tempFile = downloadImage(imgUrl);
String wechatUrl = uploadToWeChat(accessToken, tempFile);
matcher.appendReplacement(result, "<img src='" + wechatUrl + "'/>");
tempFile.delete();
}
matcher.appendTail(result);
return result.toString();
}
// 4. 创建草稿
private static void createDraft(String accessToken, String title, String content) throws IOException {
String url = "https://api.weixin.qq.com/cgi-bin/draft/add?access_token=" + accessToken;
JSONObject article = new JSONObject()
.put("title", title)
.put("content", content)
.put("thumb_media_id", "qR_BnS7D9o1TqpJLTGV3Pmbnz48dU3zFGu6Y_9ws5iKDXNFBGdIHIyRXJVuIjK1b")
.put("show_cover_pic", 1);
JSONArray articles = new JSONArray().put(article);
String requestBody = new JSONObject().put("articles", articles).toString();
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
try (OutputStream os = conn.getOutputStream()) {
os.write(requestBody.getBytes("UTF-8"));
}
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String line;
StringBuilder response = new StringBuilder();
while ((line = br.readLine()) != null) {
response.append(line);
}
logger.warn("草稿创建结果: " + response);
System.out.println("草稿创建结果: " + response);
}
}
}

@ -744,8 +744,8 @@
</select>
<!-- 添加记录 -->
<insert id="insertContent" parameterType="com.cjy.back.ybsjMessageInfo.entity.YbsjTkContent">
INSERT INTO ybsj_tk_content (messageInfoId, content, startTime, endTime)
VALUES (#{message_info_id}, #{content}, #{start_time}, #{end_time})
INSERT INTO ybsj_tk_content (message_info_id, content, start_time, end_time)
VALUES (#{messageInfoId}, #{content}, #{startTime}, #{endTime})
</insert>
<!-- 修改记录 -->

@ -448,7 +448,7 @@ function showPopupSetting(checkbox, guid, popupData) {
<div class="layui-form-item">
<label class="layui-form-label">弹出内容</label>
<div class="layui-input-block">
<textarea id="popupContent" placeholder="请输入弹窗内容" class="layui-textarea">${popupData.content || ''}</textarea>
<textarea id="popupContent" placeholder="请输入弹窗内容" class="layui-textarea">${popupData.content || ''} </textarea>
</div>
</div>
<div class="layui-form-item">

@ -87,7 +87,7 @@
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="speak"><i class="layui-icon layui-icon-edit"></i>详情</a>
x
{{# if(d.state== 0 || d.state== 4){ }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="cancel">取消预约</a>
{{# } }}
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除记录</a>

Loading…
Cancel
Save