feat 增加报备详情接口,和页面

dev_backend_yly
GPU is all you need 4 years ago
parent 1fc066b64a
commit 0dc428dc16
  1. 12
      IOReportSysBE/src/main/java/edu/ncst/ioreport/controller/IORecordsController.java
  2. 2
      IOReportSysBE/src/main/java/edu/ncst/ioreport/mapper/IORecordsMapper.java
  3. 3
      IOReportSysBE/src/main/java/edu/ncst/ioreport/service/IIORecordService.java
  4. 105
      IOReportSysBE/src/main/java/edu/ncst/ioreport/service/impl/IORecordServiceImpl.java
  5. 2
      IOReportSysBE/src/main/java/edu/ncst/ioreport/service/impl/ResourceServiceImpl.java
  6. 18
      IOReportSysBE/src/main/resources/mapping/IORecordMapper.xml
  7. 3
      IOReportSysMP/miniprogram/pages/audit/detail/index.scss
  8. 69
      IOReportSysMP/miniprogram/pages/audit/detail/index.ts
  9. 29
      IOReportSysMP/miniprogram/pages/audit/detail/index.wxml
  10. 30
      IOReportSysMP/miniprogram/pages/audit/list/auditList.ts
  11. 5
      IOReportSysMP/miniprogram/pages/audit/list/auditList.wxml
  12. 33
      IOReportSysMP/miniprogram/services/mods/iORecords/denyIORecord.ts
  13. 5
      IOReportSysMP/miniprogram/services/mods/iORecords/index.ts
  14. 33
      IOReportSysMP/miniprogram/services/mods/iORecords/passIORecord.ts

@ -44,4 +44,16 @@ public class IORecordsController {
int id = iioRecordService.addIORecord(param); int id = iioRecordService.addIORecord(param);
return ResultUtils.success(Integer.valueOf(id)); return ResultUtils.success(Integer.valueOf(id));
} }
@ApiOperation("根据记录ID获取记录详细信息")
@GetMapping("/pass")
public ResultVO<Integer> passIORecord(@RequestParam Integer recordId){
iioRecordService.passIORecord(recordId);
return ResultUtils.success("通过成功");
}
@ApiOperation("根据记录ID获取记录详细信息")
@GetMapping("/deny")
public ResultVO<Integer> denyIORecord(@RequestParam Integer recordId){
iioRecordService.denyIORecord(recordId);
return ResultUtils.success("拒绝成功");
}
} }

@ -8,4 +8,6 @@ import org.springframework.stereotype.Repository;
@Repository @Repository
public interface IORecordsMapper extends BaseMapper<IORecords> { public interface IORecordsMapper extends BaseMapper<IORecords> {
int insertAndGetId(IORecords record); int insertAndGetId(IORecords record);
int auditIORecord(IORecords record);
} }

@ -12,4 +12,7 @@ public interface IIORecordService {
IORecords getIORecordsDetail(Integer ID); IORecords getIORecordsDetail(Integer ID);
int addIORecord(IORecords record); int addIORecord(IORecords record);
void passIORecord(Integer recordId);
void denyIORecord(Integer recordId);
} }

@ -1,13 +1,12 @@
package edu.ncst.ioreport.service.impl; package edu.ncst.ioreport.service.impl;
import afu.org.checkerframework.checker.oigj.qual.O;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import edu.ncst.ioreport.exception.BusinessException; import edu.ncst.ioreport.exception.BusinessException;
import edu.ncst.ioreport.exception.CodeMsg; import edu.ncst.ioreport.exception.CodeMsg;
import edu.ncst.ioreport.mapper.IORecordsMapper; import edu.ncst.ioreport.mapper.IORecordsMapper;
import edu.ncst.ioreport.model.IORecords; import edu.ncst.ioreport.model.IORecords;
import edu.ncst.ioreport.model.User;
import edu.ncst.ioreport.service.IIORecordService; import edu.ncst.ioreport.service.IIORecordService;
import edu.ncst.ioreport.utils.SessionUtils; import edu.ncst.ioreport.utils.SessionUtils;
import edu.ncst.ioreport.vo.QRToken; import edu.ncst.ioreport.vo.QRToken;
@ -17,9 +16,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service @Service
public class IORecordServiceImpl implements IIORecordService { public class IORecordServiceImpl implements IIORecordService {
@ -27,6 +27,7 @@ public class IORecordServiceImpl implements IIORecordService {
private IORecordsMapper recordsMapper; private IORecordsMapper recordsMapper;
@Autowired @Autowired
private RedisTemplate<String, String> stringRedisTemplate; private RedisTemplate<String, String> stringRedisTemplate;
@Override @Override
public List<IORecords> getIORecordsList(QRecord query) { public List<IORecords> getIORecordsList(QRecord query) {
IORecords ioRecords = new IORecords(); IORecords ioRecords = new IORecords();
@ -41,28 +42,28 @@ public class IORecordServiceImpl implements IIORecordService {
@Override @Override
public IORecords getIORecordsDetail(Integer ID) { public IORecords getIORecordsDetail(Integer ID) {
if(null==ID){ if (null == ID) {
throw new BusinessException(CodeMsg.PARAM_ERROR.fillArgs("记录单ID为空")); throw new BusinessException(CodeMsg.PARAM_ERROR.fillArgs("记录单ID为空"));
} }
IORecords records = recordsMapper.selectById(ID); IORecords records = recordsMapper.selectById(ID);
if(records.getStatus().compareTo("SCHOOL_PASS")==0){ if (records.getStatus().compareTo("SCHOOL_PASS") == 0) {
if(!stringRedisTemplate.hasKey("qrToken_"+ID)){ if (!stringRedisTemplate.hasKey("qrToken_" + ID)) {
QRToken qrToken = new QRToken(); QRToken qrToken = new QRToken();
qrToken.setRecordID(ID); qrToken.setRecordID(ID);
stringRedisTemplate.opsForValue().set("qrToken_"+ID,JSON.toJSONString(qrToken),1, TimeUnit.MINUTES); stringRedisTemplate.opsForValue().set("qrToken_" + ID, JSON.toJSONString(qrToken), 1, TimeUnit.MINUTES);
} }
String qrTokenStr = stringRedisTemplate.opsForValue().get("qrToken_"+ID); String qrTokenStr = stringRedisTemplate.opsForValue().get("qrToken_" + ID);
QRToken qrToken = JSON.parseObject(qrTokenStr,QRToken.class); QRToken qrToken = JSON.parseObject(qrTokenStr, QRToken.class);
if(qrToken!=null){ if (qrToken != null) {
Long seconds = stringRedisTemplate.getExpire("qrToken_"+ID); Long seconds = stringRedisTemplate.getExpire("qrToken_" + ID);
qrToken.setExpireTime(seconds); qrToken.setExpireTime(seconds);
records.setQrToken(qrToken); records.setQrToken(qrToken);
} }
} }
if(null==records){ if (null == records) {
throw new BusinessException("记录不存在"); throw new BusinessException("记录不存在");
} }
return records; return records;
@ -72,18 +73,88 @@ public class IORecordServiceImpl implements IIORecordService {
public int addIORecord(IORecords record) { public int addIORecord(IORecords record) {
UserInfoVO user = SessionUtils.getCurrentUser(); UserInfoVO user = SessionUtils.getCurrentUser();
List<String> roles = user.getRoles(); List<String> roles = user.getRoles();
if(roles==null||(roles.size()==1&&user.getRoles().get(0).compareTo("DOOR_GUARD")==0)){ if (roles == null || (roles.size() == 1 && user.getRoles().get(0).compareTo("DOOR_GUARD") == 0)) {
throw new BusinessException(CodeMsg.CAN_NOT_DATA_ACCESS); throw new BusinessException(CodeMsg.CAN_NOT_DATA_ACCESS);
} }
if(user.getTeacherID().compareTo(record.getTeacherID())!=0){ if (user.getTeacherID().compareTo(record.getTeacherID()) != 0) {
throw new BusinessException(CodeMsg.BUSINESS_ERROR.fillArgs("当前用户为"+user.getTeacherID()+",与单据中提交人不一致")); throw new BusinessException(CodeMsg.BUSINESS_ERROR.fillArgs("当前用户为" + user.getTeacherID() + ",与单据中提交人不一致"));
} }
record.setStatus("SUBMIT"); record.setStatus("SUBMIT");
int id = recordsMapper.insertAndGetId(record); int id = recordsMapper.insertAndGetId(record);
if(id==1){ if (id == 1) {
return record.getId(); return record.getId();
}else{ } else {
throw new BusinessException(CodeMsg.ADD_ERROR); throw new BusinessException(CodeMsg.ADD_ERROR);
} }
} }
// 审核通过接口
@Override
public void passIORecord(Integer recordId) {
if (null == recordId) {
throw new BusinessException(CodeMsg.PARAM_ERROR.fillArgs("记录单ID为空"));
}
// user 是审核人信息
IORecords ioRecords = recordsMapper.selectById(recordId);
if (ioRecords == null) {
throw new BusinessException("记录不存在");
}
// if (!ioRecords.getStatus().equals("SUBMIT")) {
// throw new BusinessException("记录不存在");
// }
UserInfoVO user = SessionUtils.getCurrentUser();
List<String> roles = user.getRoles();
List<String> res_1 = roles.stream().filter(role -> role.equals("SCHOOL_AUDITOR") || role.equals("DEPART_AUDITOR")).collect(Collectors.toList());
if (res_1.size() == 0) {
throw new BusinessException(CodeMsg.CAN_NOT_DATA_ACCESS);
}
List<String> res_2 = res_1.stream().filter(role -> role.equals("DEPT_AUDITOR")).collect(Collectors.toList());
if (res_2.size() != 0) {
ioRecords.setStatus("DEPT_PASS");
ioRecords.setDeptAuditorID(user.getUserID());
ioRecords.setDeptAuditTime(new Date());
}
List<String> res_3 = res_1.stream().filter(role -> role.equals("SCHOOL_AUDITOR")).collect(Collectors.toList());
if (res_3.size() != 0) {
ioRecords.setStatus("SCHOOL_PASS");
ioRecords.setSchoolAuditorID(user.getUserID());
ioRecords.setSchoolAuditTime(new Date());
}
// 更新数据库
recordsMapper.auditIORecord(ioRecords);
}
// 审核通过接口
@Override
public void denyIORecord(Integer recordId) {
if (null == recordId) {
throw new BusinessException(CodeMsg.PARAM_ERROR.fillArgs("记录单ID为空"));
}
// user 是审核人信息
IORecords ioRecords = recordsMapper.selectById(recordId);
if (ioRecords == null) {
throw new BusinessException("记录不存在");
}
UserInfoVO user = SessionUtils.getCurrentUser();
List<String> roles = user.getRoles();
List<String> res_1 = roles.stream().filter(role -> role.equals("SCHOOL_AUDITOR") || role.equals("DEPART_AUDITOR")).collect(Collectors.toList());
if (res_1.size() == 0) {
throw new BusinessException(CodeMsg.CAN_NOT_DATA_ACCESS);
}
List<String> res_2 = res_1.stream().filter(role -> role.equals("DEPT_AUDITOR")).collect(Collectors.toList());
if (res_2.size() != 0) {
ioRecords.setStatus("DEPT_DENY");
ioRecords.setDeptAuditorID(user.getUserID());
ioRecords.setDeptAuditTime(new Date());
}
List<String> res_3 = res_1.stream().filter(role -> role.equals("SCHOOL_AUDITOR")).collect(Collectors.toList());
if (res_3.size() != 0) {
ioRecords.setStatus("SCHOOL_DENY");
ioRecords.setSchoolAuditorID(user.getUserID());
ioRecords.setSchoolAuditTime(new Date());
}
// 更新数据库
recordsMapper.auditIORecord(ioRecords);
}
} }

@ -58,6 +58,8 @@ public class ResourceServiceImpl implements IResourceService {
urls.add("/api/records/detail"); urls.add("/api/records/detail");
urls.add("/api/records/list"); urls.add("/api/records/list");
urls.add("/api/records/add"); urls.add("/api/records/add");
urls.add("/api/records/pass");
urls.add("/api/records/deny");
return urls; return urls;
} }
} }

@ -10,6 +10,22 @@
<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="id" parameterType="edu.ncst.ioreport.model.IORecords"> <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="id" parameterType="edu.ncst.ioreport.model.IORecords">
insert into iorecords (teacherid,iotype,outerResidence,innerResidence,reason,committime,status) insert into iorecords (teacherid,iotype,outerResidence,innerResidence,reason,committime,status)
values(#{teacherID},#{ioType},#{outerResidence},#{innerResidence},#{reason},#{commitTime},#{status}) values(1,#{ioType},#{outerResidence},#{innerResidence},#{reason},#{commitTime},#{status})
</insert> </insert>
<update id="auditIORecord" parameterType="edu.ncst.ioreport.model.IORecords">
update iorecords set teacherid = #{teacherID},
<if test="deptAuditorID != null">
set deptAuditorID = #{deptAuditorID},
</if>
<if test="deptAuditTime != null">
set DeptAuditTime = #{deptAuditTime},
</if>
<if test="schoolAuditorID != null">
set SchoolAuditorID = #{schoolAuditorID},
</if>
<if test="schoolAuditTime != null">
set SchoolAuditTime = #{schoolAuditTime},
</if>
status = #{status} where id = #{id}
</update>
</mapper> </mapper>

@ -1,4 +1,5 @@
.report-info-container { .report-info-container {
font-size: 18px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background-color: var(--color-gray-0); background-color: var(--color-gray-0);
@ -20,7 +21,7 @@
.submit-button { .submit-button {
position: absolute; position: absolute;
bottom: 0; bottom: 0px;
left: 0; left: 0;
right: 0; right: 0;
display: flex; display: flex;

@ -1,30 +1,54 @@
import orderApi from "../../../api/orderApi/orderApi" import { IORecords } from '../../../services/baseClass'
const orderType = ['出校报备', '进校报备'] import services from "../../../services/index"
const reportStatus = ['通过', '院级审核', '校级审核', '退回'] import { formatDateTimeStr } from '../../../utils/util'
// 字典数据
const ioRecordType = ['入', '出']
const ioRecordStatus = {
SAVE: '保存',
SUBMIT: "提交待审核",
HOSPITAL_PASS: '院级审核通过',
SCHOOL_PASS: '校级审核通过',
VERIFICATION_PASS: '核验通过',
HOSPITAL_NOT_PASS: '院级审核不通过',
SCHOOL_NOT_PASS: '校级审核不通过',
VERIFICATION_NOT_PASS: '核验不通过',
}
Page({ Page({
data: { /**
*
*/
data: {
showQrcode: false,
ioRecord: IORecords,
expireTime: null,
ioRecordType,
ioRecordStatus,
}, },
onLoad() { onLoad: async function () {
const reportID = wx.getStorageSync("auditList/auditList") // TODO orderinfo by orderID
orderApi.getOrderDetailByOrderID(reportID).then(res => { // const reportID = wx.getStorageSync("myReport/myReport")
res.reportStatus = reportStatus[res.reportStatus as any] as any this.getRecordDetail();
res.reportType = orderType[res.reportType as any] as any let record = this.data.ioRecord;
this.setData(res)
})
},
onPass(event: WechatMiniprogram.Input) {
orderApi.passOrder(event.currentTarget.dataset.reportID)
}, },
onDeny(event: WechatMiniprogram.Input) { getRecordDetail: async function () {
orderApi.denyOrder(event.currentTarget.dataset.reportID) const reportID = wx.getStorageSync("auditList/auditList")
let res = await services.API.iORecords.getIORecordByID.request({ ID: reportID });
if (res && res.data) {
let record = res.data;
console.log(res)
this.setData({ ioRecord: record ? record : null });
}
}, },
/**
* --
*/
onReady() {
async onPass() {
const res = await services.API.iORecords.passIORecord.request({ recordId: this.data.ioRecord.id })
wx.showToast({title:res.msg!,icon:'none'})
},
async onDeny() {
const res = await services.API.iORecords.passIORecord.request({ recordId: this.data.ioRecord.id })
wx.showToast({title:res.msg!,icon:'none'})
}, },
/** /**
@ -38,15 +62,12 @@ Page({
* -- * --
*/ */
onHide() { onHide() {
console.log("onhide");
}, },
/** /**
* -- * --
*/ */
onUnload() {
},
/** /**
* -- * --

@ -1,15 +1,22 @@
<navigationBar title="审核详情"></navigationBar> <navigationBar title="报备详情"></navigationBar>
<view class="report-info-container"> <view>
<view class="card-col-1"> <view class="report-info-container">
<yinput onlyRead padding="6px" label="工号:" defaultValue="{{id}}" /> <view class="card-col-1">
<yinput onlyRead padding="6px" label="姓名:" defaultValue="{{name}}" /> <yinput onlyRead padding="3px" label="工号:" value="{{ioRecord.teacherID}}" />
<yinput onlyRead padding="3px" label="姓名:" value="{{ioRecord.teacherID}}" />
</view>
<yinput onlyRead padding="3px" label="手机号:" value="{{ioRecord.mobile?ioRecord.mobile:'无'}}" />
<view class="card-col-1">
<yinput onlyRead padding="3px" label="类型:" value="{{ioRecordType[ioRecord.ioType]}}" />
</view>
<view class="card-col-1">
<yinput onlyRead padding="3px" label="状态:" value="{{ioRecordStatus[ioRecord.status]}}" />
</view>
<yinput onlyRead padding="3px" label="校内居住地:" value="{{ioRecord.innerResidence}}" />
<yinput onlyRead padding="3px" label="校外居住地:" value="{{ioRecord.outerResidence}}" />
<yinput onlyRead padding="3px" label="事由:" value="{{ioRecord.reason}}" />
</view> </view>
<yinput onlyRead padding="6px" label="手机号:" defaultValue="{{phone}}" />
<yinput onlyRead padding="6px" label="类型:" defaultValue="{{reportType}}" />
<yinput onlyRead padding="6px" label="状态:" defaultValue="{{reportStatus}}" />
<yinput onlyRead padding="6px" label="校内居住地:" defaultValue="{{phone}}" />
<yinput onlyRead padding="6px" label="校外居住地:" defaultValue="{{outerLocation}}" />
<yinput onlyRead padding="6px" label="事由:" defaultValue="{{reason}}" />
</view> </view>
<view class="submit-button"> <view class="submit-button">
<ybutton bindtap="onPass" class="button-item" lineHeight="50px" title="通过" bgColor="var(--color-primary)" /> <ybutton bindtap="onPass" class="button-item" lineHeight="50px" title="通过" bgColor="var(--color-primary)" />

@ -1,9 +1,7 @@
// pages/my-report/myReport.ts import services from "../../../services/index"
Page({ import constant from "../../../utils/constant"
/** Page({
*
*/
data: { data: {
reportInfos:[] as any, reportInfos:[] as any,
noData: false, noData: false,
@ -16,22 +14,28 @@ Page({
} }
}, },
bindtap(event: WechatMiniprogram.Input) { bindtap(event: WechatMiniprogram.Input) {
const { reportID } = event.currentTarget.dataset const { reportid } = event.currentTarget.dataset
wx.setStorageSync("auditList/auditList", reportID) wx.setStorageSync("auditList/auditList", reportid)
wx.navigateTo({ url: "../auditDetail/auditDetail" }) wx.navigateTo({ url: "../detail/index" })
}, },
onSubmit({ detail }: { detail: Record<string, string> }) { onSubmit({ detail }: { detail: Record<string, string> }) {
// orderApi.getOrderDetailFilter(detail.reportType, detail.reportStatus).then(res => { // orderApi.getOrderDetailFilter(detail.reportType, detail.reportStatus).then(res => {
// this.setData({reportInfos:res || []}) // this.setData({reportInfos:res || []})
// }) // })
}, },
/**
* --
*/
onLoad() {
// 单据id 报备时间 报备类型 审核人 审核状态 // 单据id 报备时间 报备类型 审核人 审核状态
// 锁? 多人同时操作一个订单怎么办 // 锁? 多人同时操作一个订单怎么办
// orderApi.getOrderInfo().then(res => this.setData({ reportInfos: res || [] })) onLoad:async function() {
const user = wx.getStorageSync(constant.USER_INFO);
console.log("user",user);
if(!user||!user.teacherID){
wx.navigateTo({url:"../../index/index.ts"})
}
let res = await services.API.iORecords.getIORecordsList.request({teacherID:user.userID});
if(res&&res.data){
console.log(res.data)
this.setData({reportInfos:res.data||[]})
}
}, },
/** /**

@ -2,9 +2,6 @@
<navigationBar title="审核列表" bindtap="bindTestTap"></navigationBar> <navigationBar title="审核列表" bindtap="bindTestTap"></navigationBar>
<sysFilterBar bindonSubmit="onSubmit"></sysFilterBar> <sysFilterBar bindonSubmit="onSubmit"></sysFilterBar>
<view class="cards-container"> <view class="cards-container">
<sysCard wx:for="{{reportInfos}}" reportStatus="{{item.reportStatus}}" reportType="{{item.reportType == '0' ? '出校报备' : '进校报备'}}" reportDateTime="{{item.reportDateTime}}" reviewer="{{item.reviewer}}" data-reportID="{{item.reportID}}" bindtap="bindtap" wx:key="reportID" /> <sysCard wx:for="{{reportInfos}}" reportStatus="{{item.status}}" reportType="{{item.ioType == '0' ? '进校报备' : '出校报备'}}" reportDateTime="{{item.commitTime}}" reviewer="{{item.schoolAuditorID==0?'无':item.schoolAuditorID}}" data-reportID="{{item.id}}" bindtap="bindtap" wx:key="id" />
</view> </view>
</view> </view>
<!-- <sysCard reportStatus="2" reportType="入校报备" reportDateTime="2022-10-4 18:18:30" reviewer="张三"></sysCard>
-->

@ -0,0 +1,33 @@
import { fetch } from '../../../utils/util';
export class Params {
/** ID */
recordId?: number;
}
export type ResponseType = Promise<defs.ResultVO<defs.IORecords>>;
export const URL = '/api/records/deny';
/**
* @desc ID获取记录详细信息
*/
export function request(
params: Params,
options?: WechatMiniprogram.RequestOption,
): ResponseType {
let url = '/api/records/deny';
const fetchOption = Object.assign(
{
url: url,
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: params,
},
options,
);
return fetch(fetchOption);
}

@ -4,5 +4,8 @@
import * as addIORecord from './addIORecord'; import * as addIORecord from './addIORecord';
import * as getIORecordByID from './getIORecordByID'; import * as getIORecordByID from './getIORecordByID';
import * as getIORecordsList from './getIORecordsList'; import * as getIORecordsList from './getIORecordsList';
import * as passIORecord from './passIORecord';
import * as denyIORecord from './denyIORecord';
export { addIORecord, getIORecordByID, getIORecordsList };
export { addIORecord, getIORecordByID, getIORecordsList, passIORecord, denyIORecord };

@ -0,0 +1,33 @@
import { fetch } from '../../../utils/util';
export class Params {
/** ID */
recordId?: number;
}
export type ResponseType = Promise<defs.ResultVO<defs.IORecords>>;
export const URL = '/api/records/pass';
/**
* @desc ID获取记录详细信息
*/
export function request(
params: Params,
options?: WechatMiniprogram.RequestOption,
): ResponseType {
let url = '/api/records/pass';
const fetchOption = Object.assign(
{
url: url,
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
params: params,
},
options,
);
return fetch(fetchOption);
}
Loading…
Cancel
Save