Compare commits

..

9 Commits

Author SHA1 Message Date
Dawn1Ocean ff926676bd change mytickets mock; add ignore for eslint error: unused state for statusToBe in ticketdetail 2024-04-06 02:27:16 +08:00
Dawn1Ocean 01614c9163 add hint for mytickets in repairpage 2024-04-06 02:05:01 +08:00
Dawn1Ocean 3375e00b37 refactor state structure in ticketdetail 2024-04-06 01:47:12 +08:00
Dawn1Ocean b14d9c363d add locale for reminder 2024-04-05 23:37:52 +08:00
Dawn1Ocean 7f017a0b47 add reminder structure in ticketdetail 2024-04-05 21:34:13 +08:00
Dawn1Ocean 5ce1db7693 refactor api for dutyinfo 2024-04-04 01:39:58 +08:00
Dawn1Ocean d34564980f change index page layout 2024-04-03 20:53:05 +08:00
Dawn1Ocean 5bd07e0ca7 refactor plain-text 2024-04-03 20:41:20 +08:00
Dawn1Ocean a07545b841 change pagination to icon; change updatedutycnt text 2024-03-30 15:56:52 +08:00
30 changed files with 772 additions and 342 deletions

View File

@ -44,9 +44,12 @@ data:
{ {
"isInDuty": true, "isInDuty": true,
"inDutyCnt": 3, "inDutyCnt": 3,
"currentDuty": "2", "currentDuty": "1",
"place": "东三-204", "place": "", // 只有当 currentDuty 为 others 时place 和 值班时间 才不为空
"otherDutyTime": "" "otherDutyStart": "",
"otherDutyEnd": "",
"offDutyReason": "",
"dutyRecoverTime": ""
} }
``` ```
@ -59,8 +62,11 @@ data:
"isInDuty": true, "isInDuty": true,
"inDutyCnt": 3, "inDutyCnt": 3,
"currentDuty": "others", "currentDuty": "others",
"place": "蓝田", "place": "蓝田", // 只有当 currentDuty 为 others 时place 才不为空
"otherDutyTime": "9:30-11:30" "otherDutyStart": "2024-03-07T11:52:48.523303", // Timestamp
"otherDutyEnd": "2024-03-07T13:52:48.523303",
"offDutyReason": "",
"dutyRecoverTime": ""
} }
``` ```
@ -71,6 +77,11 @@ data:
```json ```json
{ {
"isInDuty": false, "isInDuty": false,
"inDutyCnt": 0,
"currentDuty": "0", // '0' 代表正常值班时间下班,'others' 代表其他值班时间下班
"place": "",
"otherDutyStart": "",
"otherDutyEnd": "",
"offDutyReason": "学园维修", "offDutyReason": "学园维修",
"dutyRecoverTime": "下周一" "dutyRecoverTime": "下周一"
} }

View File

@ -14,18 +14,19 @@ export default {
'GET /duty/info': { 'GET /duty/info': {
success: true, success: true,
data: { data: {
token: 'token_test',
isInDuty: true, isInDuty: true,
inDutyCnt: 3, inDutyCnt: 3,
currentDuty: 'others', currentDuty: 'others',
otherDutyTime: '9:30-11:30', otherDutyStart: '2024-03-07T09:30:48.523303',
otherDutyEnd: '2024-03-07T13:30:48.523303',
place: '蓝田', place: '蓝田',
offDutyReason: '',
dutyRecoverTime: '',
}, },
}, },
'GET /user/info': { 'GET /user/info': {
success: true, success: true,
data: { data: {
token: 'token_test',
name: '马保国', name: '马保国',
phone: 13333333333, phone: 13333333333,
}, },
@ -116,7 +117,6 @@ export default {
'GET /member/duty/info': { 'GET /member/duty/info': {
success: true, success: true,
data: { data: {
token: 'token_test',
isInDuty: true, isInDuty: true,
inDutyCnt: 6, inDutyCnt: 6,
currentDuty: '3', currentDuty: '3',

View File

@ -3,13 +3,24 @@
{ {
"id": 6830, "id": 6830,
"type": 1, "type": 1,
"status": 2, "status": 3,
"device": "主机", "device": "主机",
"deviceModel": "技嘉", "deviceModel": "技嘉",
"owner": "武技栏", "owner": "武技栏",
"phone": "18888888888", "phone": "18888888888",
"createdTime": "2024-03-06T19:49:27.043865", "createdTime": "2024-03-06T19:49:27.043865",
"isConfirmed": false "isConfirmed": false
},
{
"id": 6831,
"type": 1,
"status": 2,
"device": "ROG",
"deviceModel": "幻 14",
"owner": "晓洋",
"phone": "18888888887",
"createdTime": "2024-03-06T19:49:27.043865",
"isConfirmed": false
} }
] ]
} }

View File

@ -8,7 +8,7 @@
"description": "清灰", "description": "清灰",
"workers": ["宇航员"], "workers": ["宇航员"],
"createdTime": "2024-03-07T19:52:48.523303", "createdTime": "2024-03-07T19:52:48.523303",
"status": 5, "status": 4,
"isConfirmed": false, "isConfirmed": false,
"notes": [ "notes": [
{ {

View File

@ -109,7 +109,7 @@ export default class DetailFramework extends Component<
marginLeft: '3%', marginLeft: '3%',
}} }}
> >
<AtCard isFull title={pt.get().ticketDetail.descTitle}> <AtCard isFull title={pt.get().ticketDetail.desc.title}>
<View className='at-article__h3'> <View className='at-article__h3'>
{this.state.ticketInfo.description} {this.state.ticketInfo.description}
</View> </View>

View File

@ -18,9 +18,9 @@ export default class NoteCard extends Component<NoteCardProps, {}> {
var message = ''; var message = '';
const note = this.props.note; const note = this.props.note;
const td = pt.get().ticketDetail; const td = pt.get().ticketDetail;
const createMessage = td.createTicketMessage; const createMessage = td.comment.createTicketMessage;
const modifyMessage = td.statusModifyMessage; const modifyMessage = td.statusModifyMessage;
const prefix = td.statusModifyPrefix; const prefix = td.comment.statusModifyPrefix;
switch (note.type) { switch (note.type) {
case 0: case 0:

View File

@ -19,14 +19,14 @@ export default class NotFoundPage extends Component {
style={{ marginTop: '150rpx', marginBottom: '240rpx' }} style={{ marginTop: '150rpx', marginBottom: '240rpx' }}
> >
<View className='at-article__h1' style={{ fontWeight: 'bold' }}> <View className='at-article__h1' style={{ fontWeight: 'bold' }}>
{pt.get().notFound.titleZhCn} {pt.get().notFound.title.ZhCn}
</View> </View>
<View className='at-article__h2'>{pt.get().notFound.descZhCn}</View> <View className='at-article__h2'>{pt.get().notFound.desc.ZhCn}</View>
<View style={{ height: '150rpx' }}></View> <View style={{ height: '150rpx' }}></View>
<View className='at-article__h1' style={{ fontWeight: 'bold' }}> <View className='at-article__h1' style={{ fontWeight: 'bold' }}>
{pt.get().notFound.titleEnUs} {pt.get().notFound.title.EnUs}
</View> </View>
<View className='at-article__h2'>{pt.get().notFound.descEnUs}</View> <View className='at-article__h2'>{pt.get().notFound.desc.EnUs}</View>
</View> </View>
<PageFooter /> <PageFooter />
</View> </View>

View File

@ -6,6 +6,7 @@ import {
AtActionSheet, AtActionSheet,
AtActionSheetItem, AtActionSheetItem,
AtButton, AtButton,
AtCheckbox,
AtFloatLayout, AtFloatLayout,
AtForm, AtForm,
AtMessage, AtMessage,
@ -22,58 +23,98 @@ import { pickTicket } from '@/service/pickTicket';
import { retrieve } from '@/service/retrieve'; import { retrieve } from '@/service/retrieve';
import { changeStatus } from '@/service/changeStatus'; import { changeStatus } from '@/service/changeStatus';
import { getDisable } from '@/service/getDisable'; import { getDisable } from '@/service/getDisable';
import { StatusStr } from './TicketNote';
const submitInterval = 5000; const submitInterval = 5000;
interface TicketDetailState { interface TicketDetailState {
id: number; id: number;
isMember: boolean; isMember: boolean;
showOreoModal: boolean; show: {
showCommentLayout: boolean; modal: {
showRetrieveModal: boolean; oreo: boolean;
showStatusSheet: boolean; retrieve: boolean;
showPickModal: boolean; pick: boolean;
};
layout: {
comment: boolean;
reminder: boolean;
};
actionSheet: {
status: boolean;
};
};
comment: string; comment: string;
isOreoLoading: boolean; isLoading: {
isOreoDisable: boolean; oreo: boolean;
isOreoDisable_main: boolean; pick: boolean;
isPickLoading: boolean; retrieve: boolean;
isPickDisable: boolean; comment: boolean;
isPickDisable_main: boolean; status: boolean;
isRetrieveLoading: boolean; reminder: boolean;
isRetrieveDisable: boolean; };
isRetrieveDisable_main: boolean; isDisable: {
isStatusLoading: boolean; oreo: boolean;
isStatusDisable: boolean; pick: boolean;
isCommentLoading: boolean; retrieve: boolean;
isCommentDisable: boolean; comment: boolean;
isCommentDisable_main: boolean; status: boolean;
reminder: boolean;
};
isDisable_main: {
oreo: boolean;
pick: boolean;
retrieve: boolean;
comment: boolean;
};
reminderList: Array<number>;
statusToBe: number;
} }
export default class TicketDetail extends Component<{}, TicketDetailState> { export default class TicketDetail extends Component<{}, TicketDetailState> {
state: Readonly<TicketDetailState> = { state: Readonly<TicketDetailState> = {
id: 0, id: 0,
isMember: false, isMember: false,
showOreoModal: false, show: {
showCommentLayout: false, modal: {
showRetrieveModal: false, oreo: false,
showStatusSheet: false, retrieve: false,
showPickModal: false, pick: false,
},
layout: {
comment: false,
reminder: false,
},
actionSheet: {
status: false,
},
},
comment: '', comment: '',
isOreoLoading: false, isLoading: {
isOreoDisable: false, oreo: false,
isOreoDisable_main: false, pick: false,
isPickLoading: false, retrieve: false,
isPickDisable: false, comment: false,
isPickDisable_main: false, status: false,
isRetrieveLoading: false, reminder: false,
isRetrieveDisable: false, },
isRetrieveDisable_main: false, isDisable: {
isStatusLoading: false, oreo: false,
isStatusDisable: false, pick: false,
isCommentLoading: false, retrieve: false,
isCommentDisable: false, comment: false,
isCommentDisable_main: false, status: false,
reminder: false,
},
isDisable_main: {
oreo: false,
pick: false,
retrieve: false,
comment: false,
},
reminderList: [],
// eslint-disable-next-line react/no-unused-state
statusToBe: 0,
}; };
componentDidMount(): void { componentDidMount(): void {
@ -88,73 +129,157 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
onAddToOreo(): void { onAddToOreo(): void {
this.setState({ this.setState({
showOreoModal: true, show: {
...this.state.show,
modal: {
...this.state.show.modal,
oreo: true,
},
},
}); });
} }
onAddComment(): void { onAddComment(): void {
this.setState({ this.setState({
showCommentLayout: true, show: {
...this.state.show,
layout: {
...this.state.show.layout,
comment: true,
},
},
}); });
} }
onRetrieved(): void { onRetrieved(): void {
this.setState({ this.setState({
showRetrieveModal: true, show: {
...this.state.show,
modal: {
...this.state.show.modal,
retrieve: true,
},
},
}); });
} }
onPick(): void { onPick(): void {
this.setState({ this.setState({
showPickModal: true, show: {
...this.state.show,
modal: {
...this.state.show.modal,
pick: true,
},
},
}); });
} }
onChangeStatus(): void { onChangeStatus(): void {
this.setState({ this.setState({
showStatusSheet: true, show: {
...this.state.show,
actionSheet: {
...this.state.show.actionSheet,
status: true,
},
},
}); });
} }
handleOreoCancel(): void { handleOreoCancel(): void {
this.setState({ this.setState({
showOreoModal: false, show: {
...this.state.show,
modal: {
...this.state.show.modal,
oreo: false,
},
},
}); });
} }
handleCommentCancel(): void { handleCommentCancel(): void {
this.setState({ this.setState({
showCommentLayout: false, show: {
...this.state.show,
layout: {
...this.state.show.layout,
comment: false,
},
},
});
}
handleReminderCancel(): void {
this.setState({
show: {
...this.state.show,
layout: {
...this.state.show.layout,
reminder: false,
},
},
}); });
} }
handleRetrieveCancel(): void { handleRetrieveCancel(): void {
this.setState({ this.setState({
showRetrieveModal: false, show: {
...this.state.show,
modal: {
...this.state.show.modal,
retrieve: false,
},
},
}); });
} }
handleStatusCancel(): void { handleStatusCancel(): void {
this.setState({ this.setState({
showStatusSheet: false, show: {
...this.state.show,
actionSheet: {
...this.state.show.actionSheet,
status: false,
},
},
}); });
} }
handlePickCancel(): void { handlePickCancel(): void {
this.setState({ this.setState({
showPickModal: false, show: {
...this.state.show,
modal: {
...this.state.show.modal,
pick: false,
},
},
}); });
} }
handleOreoConfirm(): void { handleOreoConfirm(): void {
this.setState({ this.setState({
isOreoDisable: true, isDisable: {
showOreoModal: false, ...this.state.isDisable,
oreo: true,
},
show: {
...this.state.show,
modal: {
...this.state.show.modal,
oreo: false,
},
},
}); });
addToOreo(this); addToOreo(this);
setTimeout(() => { setTimeout(() => {
this.setState({ this.setState({
isOreoDisable: false, isDisable: {
...this.state.isDisable,
oreo: false,
},
}); });
}, submitInterval); }, submitInterval);
return; return;
@ -162,13 +287,25 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
handleRetrieveConfirm(): void { handleRetrieveConfirm(): void {
this.setState({ this.setState({
isRetrieveDisable: true, isDisable: {
showRetrieveModal: false, ...this.state.isDisable,
retrieve: true,
},
show: {
...this.state.show,
modal: {
...this.state.show.modal,
retrieve: false,
},
},
}); });
retrieve(this); retrieve(this);
setTimeout(() => { setTimeout(() => {
this.setState({ this.setState({
isRetrieveDisable: false, isDisable: {
...this.state.isDisable,
retrieve: false,
},
}); });
}, submitInterval); }, submitInterval);
return; return;
@ -176,27 +313,73 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
handlePickConfirm(): void { handlePickConfirm(): void {
this.setState({ this.setState({
isPickDisable: true, isDisable: {
showPickModal: false, ...this.state.isDisable,
pick: true,
},
show: {
...this.state.show,
modal: {
...this.state.show.modal,
pick: false,
},
},
}); });
pickTicket(this); pickTicket(this);
setTimeout(() => { setTimeout(() => {
this.setState({ this.setState({
isPickDisable: false, isDisable: {
...this.state.isDisable,
pick: false,
},
}); });
}, submitInterval); }, submitInterval);
return; return;
} }
handleStatusChange(status: number): void { handleStatusChange(status: number): void {
this.setState({ if (status == 3 || status == 5 || status == 7) {
showStatusSheet: false, this.setState({
isStatusDisable: true, isDisable: {
}); ...this.state.isDisable,
changeStatus(this, status); status: true,
},
show: {
...this.state.show,
actionSheet: {
...this.state.show.actionSheet,
status: false,
},
layout: {
...this.state.show.layout,
reminder: true,
},
},
// eslint-disable-next-line react/no-unused-state
statusToBe: status,
});
} else {
this.setState({
isDisable: {
...this.state.isDisable,
status: true,
},
show: {
...this.state.show,
actionSheet: {
...this.state.show.actionSheet,
status: false,
},
},
});
changeStatus(this);
}
setTimeout(() => { setTimeout(() => {
this.setState({ this.setState({
isStatusDisable: false, isDisable: {
...this.state.isDisable,
status: false,
},
}); });
}, submitInterval); }, submitInterval);
return; return;
@ -211,8 +394,17 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
onCommentSubmit() { onCommentSubmit() {
this.setState({ this.setState({
isCommentDisable: true, isDisable: {
showCommentLayout: false, ...this.state.isDisable,
comment: true,
},
show: {
...this.state.show,
layout: {
...this.state.show.layout,
comment: false,
},
},
}); });
if (this.state.comment == '') { if (this.state.comment == '') {
Taro.atMessage({ Taro.atMessage({
@ -221,7 +413,10 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
}); });
setTimeout(() => { setTimeout(() => {
this.setState({ this.setState({
isCommentDisable: false, isDisable: {
...this.state.isDisable,
comment: false,
},
}); });
}, submitInterval); }, submitInterval);
return; return;
@ -229,11 +424,81 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
submitComment(this); submitComment(this);
setTimeout(() => { setTimeout(() => {
this.setState({ this.setState({
isCommentDisable: false, isDisable: {
...this.state.isDisable,
comment: false,
},
}); });
}, submitInterval); }, submitInterval);
} }
handleReminderChange(reminderList: Array<number>) {
this.setState({
reminderList: reminderList,
});
return reminderList;
}
onReminderSubmit() {
if (
this.state.reminderList.includes(1) &&
this.state.reminderList.includes(3)
) {
this.setState({
isDisable: {
...this.state.isDisable,
reminder: true,
},
show: {
...this.state.show,
layout: {
...this.state.show.layout,
reminder: false,
},
},
});
changeStatus(this);
} else {
this.setState({
isDisable: {
...this.state.isDisable,
reminder: true,
},
});
Taro.atMessage({
message: pt.get().ticketDetail.reminder.error,
type: 'error',
});
}
setTimeout(() => {
this.setState({
isDisable: {
...this.state.isDisable,
reminder: false,
},
});
}, submitInterval);
}
reminderOption = [
{
value: 0,
label: pt.get().ticketDetail.reminder.r0,
},
{
value: 1,
label: pt.get().ticketDetail.reminder.r1,
},
{
value: 2,
label: pt.get().ticketDetail.reminder.r2,
},
{
value: 3,
label: pt.get().ticketDetail.reminder.r3,
},
];
render(): ReactNode { render(): ReactNode {
const middleButton = this.state.isMember ? ( const middleButton = this.state.isMember ? (
<View> <View>
@ -246,14 +511,14 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }} style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }}
> >
<AtButton <AtButton
loading={this.state.isPickLoading} loading={this.state.isLoading.pick}
disabled={ disabled={
this.state.isPickDisable || this.state.isPickDisable_main this.state.isDisable.pick || this.state.isDisable_main.pick
} }
type='secondary' type='secondary'
onClick={this.onPick.bind(this)} onClick={this.onPick.bind(this)}
> >
{pt.get().ticketDetail.pick} {pt.get().ticketDetail.button.pick}
</AtButton> </AtButton>
</View> </View>
<View <View
@ -261,14 +526,14 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }} style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }}
> >
<AtButton <AtButton
loading={this.state.isOreoLoading} loading={this.state.isLoading.oreo}
disabled={ disabled={
this.state.isOreoDisable || this.state.isOreoDisable_main this.state.isDisable.oreo || this.state.isDisable_main.oreo
} }
type='primary' type='primary'
onClick={this.onAddToOreo.bind(this)} onClick={this.onAddToOreo.bind(this)}
> >
{pt.get().ticketDetail.addToOreo} {pt.get().ticketDetail.button.addToOreo}
</AtButton> </AtButton>
</View> </View>
</View> </View>
@ -281,12 +546,12 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }} style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }}
> >
<AtButton <AtButton
loading={this.state.isStatusLoading} loading={this.state.isLoading.status}
disabled={this.state.isStatusDisable} disabled={this.state.isDisable.status}
type='primary' type='primary'
onClick={this.onChangeStatus.bind(this)} onClick={this.onChangeStatus.bind(this)}
> >
{pt.get().ticketDetail.status.button} {pt.get().ticketDetail.button.status}
</AtButton> </AtButton>
</View> </View>
<View <View
@ -295,13 +560,14 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
> >
<AtButton <AtButton
disabled={ disabled={
this.state.isCommentDisable || this.state.isCommentDisable_main this.state.isDisable.comment ||
this.state.isDisable_main.comment
} }
loading={this.state.isCommentLoading} loading={this.state.isLoading.comment}
type='secondary' type='secondary'
onClick={this.onAddComment.bind(this)} onClick={this.onAddComment.bind(this)}
> >
{pt.get().ticketDetail.addNote} {pt.get().ticketDetail.button.addNote}
</AtButton> </AtButton>
</View> </View>
</View> </View>
@ -316,14 +582,15 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }} style={{ marginLeft: '20rpx', paddingRight: '10rpx', width: '50%' }}
> >
<AtButton <AtButton
loading={this.state.isRetrieveLoading} loading={this.state.isLoading.retrieve}
disabled={ disabled={
this.state.isRetrieveDisable || this.state.isRetrieveDisable_main this.state.isDisable.retrieve ||
this.state.isDisable_main.retrieve
} }
type='primary' type='primary'
onClick={this.onRetrieved.bind(this)} onClick={this.onRetrieved.bind(this)}
> >
{pt.get().ticketDetail.tookAway} {pt.get().ticketDetail.button.tookAway}
</AtButton> </AtButton>
</View> </View>
<View <View
@ -332,18 +599,38 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
> >
<AtButton <AtButton
disabled={ disabled={
this.state.isCommentDisable || this.state.isCommentDisable_main this.state.isDisable.comment || this.state.isDisable_main.comment
} }
loading={this.state.isCommentLoading} loading={this.state.isLoading.comment}
type='secondary' type='secondary'
onClick={this.onAddComment.bind(this)} onClick={this.onAddComment.bind(this)}
> >
{pt.get().ticketDetail.addNote} {pt.get().ticketDetail.button.addNote}
</AtButton> </AtButton>
</View> </View>
</View> </View>
); );
const actionSheetItemList: Array<StatusStr> = [
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
];
const sheetItemsRenderer = actionSheetItemList.map((item, idx) => (
<AtActionSheetItem
key={idx}
onClick={this.handleStatusChange.bind(this, idx)}
>
{pt.get().ticketDetail.statusModifyMessage.get(item)}
</AtActionSheetItem>
));
const isInfoShow = { const isInfoShow = {
device: true, device: true,
createdTime: true, createdTime: true,
@ -358,7 +645,7 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
<View> <View>
<AtMessage /> <AtMessage />
<AtModal <AtModal
isOpened={this.state.showOreoModal} isOpened={this.state.show.modal.oreo}
title={pt.get().modal.addToOreo.title} title={pt.get().modal.addToOreo.title}
cancelText={pt.get().modal.cancel} cancelText={pt.get().modal.cancel}
confirmText={pt.get().modal.confirm} confirmText={pt.get().modal.confirm}
@ -367,7 +654,7 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
content={pt.get().modal.addToOreo.content} content={pt.get().modal.addToOreo.content}
/> />
<AtModal <AtModal
isOpened={this.state.showRetrieveModal} isOpened={this.state.show.modal.retrieve}
title={pt.get().modal.retrieve.title} title={pt.get().modal.retrieve.title}
cancelText={pt.get().modal.cancel} cancelText={pt.get().modal.cancel}
confirmText={pt.get().modal.confirm} confirmText={pt.get().modal.confirm}
@ -376,7 +663,7 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
content={pt.get().modal.retrieve.content} content={pt.get().modal.retrieve.content}
/> />
<AtModal <AtModal
isOpened={this.state.showPickModal} isOpened={this.state.show.modal.pick}
title={pt.get().modal.pick.title} title={pt.get().modal.pick.title}
cancelText={pt.get().modal.cancel} cancelText={pt.get().modal.cancel}
confirmText={pt.get().modal.confirm} confirmText={pt.get().modal.confirm}
@ -385,7 +672,7 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
content={pt.get().modal.pick.content} content={pt.get().modal.pick.content}
/> />
<AtFloatLayout <AtFloatLayout
isOpened={this.state.showCommentLayout} isOpened={this.state.show.layout.comment}
title={pt.get().ticketDetail.comment.title} title={pt.get().ticketDetail.comment.title}
onClose={this.handleCommentCancel.bind(this)} onClose={this.handleCommentCancel.bind(this)}
> >
@ -402,37 +689,35 @@ export default class TicketDetail extends Component<{}, TicketDetailState> {
</AtButton> </AtButton>
</AtForm> </AtForm>
</AtFloatLayout> </AtFloatLayout>
<AtFloatLayout
isOpened={this.state.show.layout.reminder}
title={pt.get().ticketDetail.reminder.title}
onClose={this.handleReminderCancel.bind(this)}
>
<AtForm onSubmit={this.onReminderSubmit.bind(this)}>
<AtCheckbox
options={this.reminderOption}
selectedList={this.state.reminderList}
onChange={this.handleReminderChange.bind(this)}
/>
<AtButton
loading={this.state.isLoading.reminder}
formType='submit'
type='primary'
disabled={this.state.isDisable.reminder}
>
{pt.get().button.buttonText.submit}
</AtButton>
</AtForm>
</AtFloatLayout>
<AtActionSheet <AtActionSheet
isOpened={this.state.showStatusSheet} isOpened={this.state.show.actionSheet.status}
cancelText={pt.get().ticketDetail.status.cancel} cancelText={pt.get().ticketDetail.status.cancel}
title={pt.get().ticketDetail.status.title} title={pt.get().ticketDetail.status.title}
onCancel={this.handleStatusCancel.bind(this)} onCancel={this.handleStatusCancel.bind(this)}
onClose={this.handleStatusCancel.bind(this)} onClose={this.handleStatusCancel.bind(this)}
> >
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 0)}> {sheetItemsRenderer}
{pt.get().ticketDetail.status.status0}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 1)}>
{pt.get().ticketDetail.status.status1}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 2)}>
{pt.get().ticketDetail.status.status2}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 3)}>
{pt.get().ticketDetail.status.status3}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 4)}>
{pt.get().ticketDetail.status.status4}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 5)}>
{pt.get().ticketDetail.status.status5}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 6)}>
{pt.get().ticketDetail.status.status6}
</AtActionSheetItem>
<AtActionSheetItem onClick={this.handleStatusChange.bind(this, 7)}>
{pt.get().ticketDetail.status.status7}
</AtActionSheetItem>
</AtActionSheet> </AtActionSheet>
<DetailFramework <DetailFramework
middleButton={middleButton} middleButton={middleButton}

View File

@ -30,4 +30,4 @@ export class ShowElements {
notelist: JSX.Element; notelist: JSX.Element;
} }
export type StatusStr = '1' | '2' | '3' | '4' | '5'; export type StatusStr = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7';

View File

@ -95,6 +95,7 @@ export default class TicketListPage extends Component<{}, TicketListState> {
<AtList>{fixListRenderer}</AtList> <AtList>{fixListRenderer}</AtList>
<View style={{ marginTop: '40rpx' }}> <View style={{ marginTop: '40rpx' }}>
<AtPagination <AtPagination
icon
total={this.state.totalPage} total={this.state.totalPage}
pageSize={this.state.pageSize} pageSize={this.state.pageSize}
current={this.state.currentPage} current={this.state.currentPage}

View File

@ -6,22 +6,24 @@ import tick from '@/assets/icons/MainPage/tick.svg';
import cross from '@/assets/icons/MainPage/cross.svg'; import cross from '@/assets/icons/MainPage/cross.svg';
import clock from '@/assets/icons/MainPage/offduty.svg'; import clock from '@/assets/icons/MainPage/offduty.svg';
import wechatUser from '@/wechat'; import wechatUser from '@/wechat';
import moment from 'moment';
export class DutyData { export class DutyData {
constructor() { constructor() {
this.isInDuty = false; this.isInDuty = false;
this.inDutyCnt = 3; this.inDutyCnt = 3;
this.currentDuty = '2'; this.currentDuty = '1';
this.otherDutyTime = '9:30-11:30'; this.otherDutyStart = '2024-03-07T13:30:48.523303';
this.offDutyReason = '学园维修'; this.otherDutyEnd = '2024-03-07T16:00:48.523303';
this.dutyRecoverTime = '下周一'; this.dutyRecoverTime = '明天 1330';
this.place = '东三-204'; this.place = '东三-204';
} }
isInDuty: boolean; isInDuty: boolean;
inDutyCnt?: number; inDutyCnt?: number;
currentDuty?: 'off' | '1' | '2' | '3' | 'others'; currentDuty?: '0' | '1' | '2' | '3' | 'others';
otherDutyTime?: string; otherDutyStart?: string;
otherDutyEnd?: string;
offDutyReason?: string; offDutyReason?: string;
dutyRecoverTime?: string; dutyRecoverTime?: string;
place: string; place: string;
@ -87,8 +89,18 @@ export class DutyInfo extends Component {
<Card isInDuty={data.isInDuty} place={data.place} /> <Card isInDuty={data.isInDuty} place={data.place} />
<AtTimeline <AtTimeline
items={[ items={[
{ title: od.reason(data.offDutyReason as string) }, {
{ title: od.recoverTime(data.dutyRecoverTime as string) }, title:
data.currentDuty == '0'
? pt.get().mainPage.normal.reason
: od.reason(data.offDutyReason as string),
},
{
title:
data.currentDuty == '0'
? pt.get().mainPage.normal.recoverTime
: od.recoverTime(data.dutyRecoverTime as string),
},
]} ]}
/> />
</View> </View>
@ -106,8 +118,11 @@ export class DutyInfo extends Component {
{ {
title: title:
data.currentDuty == 'others' data.currentDuty == 'others'
? id.currentDutyText('others') + data.otherDutyTime ? id.currentDutyText('others') +
: id.currentDutyText(data.currentDuty || 'off'), moment(data.otherDutyStart).format('H:mm') +
' - ' +
moment(data.otherDutyEnd).format('H:mm')
: id.currentDutyText(data.currentDuty || '0'),
}, },
{ title: id.inDutyCnt(data.inDutyCnt as number) }, { title: id.inDutyCnt(data.inDutyCnt as number) },
]} ]}

View File

@ -21,13 +21,13 @@ export default class TitleCard extends React.Component {
<View className='page-title'> <View className='page-title'>
<View className='at-article__h1' style={{ fontWeight: 'bold' }}> <View className='at-article__h1' style={{ fontWeight: 'bold' }}>
{wechatUser.getAccess() {wechatUser.getAccess()
? memberPage.mainTitleLine + wechatUser.getInfo().name ? memberPage.titleLine.main.index + wechatUser.getInfo().name
: mainPage.mainTitleLine} : mainPage.titleLine.main}
</View> </View>
<View className='at-article__h2'> <View className='at-article__h2'>
{wechatUser.getAccess() {wechatUser.getAccess()
? memberPage.subTitleLine ? memberPage.titleLine.sub.index
: mainPage.subTitleLine} : mainPage.titleLine.sub}
</View> </View>
</View> </View>
</View> </View>

View File

@ -265,12 +265,18 @@ export default class MainPage extends Component<{}, MainPageState> {
/> />
</View> </View>
{wechatUser.getAccess() ? ( {wechatUser.getAccess() ? (
<View> <View style={{ marginTop: '40rpx' }}>
<View
className='at-article__h3'
style={{ marginBottom: '20rpx', fontWeight: 'bold' }}
>
{memberPage.ticketList.hint}
</View>
<AtList>{fixListRenderer}</AtList> <AtList>{fixListRenderer}</AtList>
<AtList> <AtList>
<AtListItem <AtListItem
title={pt.get().mainPage.ticketList.title} title={pt.get().memberPage.ticketList.title}
note={pt.get().mainPage.ticketList.note} note={pt.get().memberPage.ticketList.note}
arrow='right' arrow='right'
thumb={clockIcon} thumb={clockIcon}
onClick={this.ticketListPage} onClick={this.ticketListPage}

View File

@ -184,9 +184,16 @@ export default class RepairPage extends Component<{}, RepairPageState> {
} }
render(): ReactNode { render(): ReactNode {
const ticketsRenderer = const hasContinuingticket = this.state.currentTicketsIdName.length !== 0;
this.state.currentTicketsIdName.length !== 0 ? ( const ticketsRenderer = hasContinuingticket ? (
this.state.currentTicketsIdName.map((pair, idx) => ( <View>
<View
className='at-article__h3'
style={{ marginBottom: '20rpx', fontWeight: 'bold' }}
>
{pt.get().repairPage.currentTicket.hint}
</View>
{this.state.currentTicketsIdName.map((pair, idx) => (
<AtCard <AtCard
key={idx} key={idx}
title={pair.values().next().value} //pair.keys().next().value == ticket['device'] + ' ' + ticket['deviceModel'] title={pair.values().next().value} //pair.keys().next().value == ticket['device'] + ' ' + ticket['deviceModel']
@ -210,10 +217,16 @@ export default class RepairPage extends Component<{}, RepairPageState> {
middleButton={middleButton} middleButton={middleButton}
/> />
</AtCard> </AtCard>
)) ))}
) : ( </View>
<View></View> ) : (
); <View
className='at-article__h3'
style={{ marginBottom: '20rpx', fontWeight: 'bold' }}
>
{pt.get().repairPage.currentTicket.nohint}
</View>
);
return ( return (
<View style={{ width: '94%', marginLeft: '3%' }}> <View style={{ width: '94%', marginLeft: '3%' }}>
<AtMessage /> <AtMessage />

View File

@ -50,10 +50,10 @@ export default class UserMemberPage extends Component {
<AtMessage /> <AtMessage />
<View className='page-title' style={{ marginBottom: '40rpx' }}> <View className='page-title' style={{ marginBottom: '40rpx' }}>
<View className='at-article__h1' style={{ fontWeight: 'bold' }}> <View className='at-article__h1' style={{ fontWeight: 'bold' }}>
{pt.get().memberPage.loginMainTitleLine} {pt.get().memberPage.titleLine.main.login}
</View> </View>
<View className='at-article__h2'> <View className='at-article__h2'>
{pt.get().memberPage.loginSubTitleLine} {pt.get().memberPage.titleLine.sub.login}
</View> </View>
</View> </View>
<AtButton <AtButton
@ -70,10 +70,10 @@ export default class UserMemberPage extends Component {
<AtMessage /> <AtMessage />
<View className='page-title' style={{ marginBottom: '40rpx' }}> <View className='page-title' style={{ marginBottom: '40rpx' }}>
<View className='at-article__h1' style={{ fontWeight: 'bold' }}> <View className='at-article__h1' style={{ fontWeight: 'bold' }}>
{pt.get().memberPage.logoutMainTitleLine} {pt.get().memberPage.titleLine.main.logout}
</View> </View>
<View className='at-article__h2'> <View className='at-article__h2'>
{pt.get().memberPage.logoutSubTitleLine} {pt.get().memberPage.titleLine.sub.logout}
</View> </View>
</View> </View>
<AtButton type='primary' onClick={this.onLogout.bind(this)}> <AtButton type='primary' onClick={this.onLogout.bind(this)}>

View File

@ -43,9 +43,9 @@ export default class UserPage extends Component {
if (this.state.clicks < 3) { if (this.state.clicks < 3) {
this.setState({ this.setState({
toastText: toastText:
pt.get().userPage.memberEntry.front + pt.get().userPage.memberEntry.prefix +
(this.state.clicks + 1).toString() + // React State's feature (this.state.clicks + 1).toString() + // React State's feature
pt.get().userPage.memberEntry.behind, pt.get().userPage.memberEntry.affix,
isToastOpen: true, isToastOpen: true,
}); });
if (this.state.clicks == 0) { if (this.state.clicks == 0) {
@ -123,7 +123,7 @@ export default class UserPage extends Component {
className='at-row at-row__justify--center at-row__align--center' className='at-row at-row__justify--center at-row__align--center'
style='height:120rpx;color:#696969;' style='height:120rpx;color:#696969;'
> >
<Text style={{ fontSize: '32rpx' }}> EVA Eta v1.0.0</Text> <Text style={{ fontSize: '32rpx' }}> EVA Eta v1.0.2</Text>
</View> </View>
<AtList> <AtList>
<AtListItem <AtListItem

View File

@ -1,14 +1,21 @@
export interface NotFoundText { export interface NotFoundText {
titleZhCn: string; title: {
titleEnUs: string; ZhCn: string;
descZhCn: string; EnUs: string;
descEnUs: string; };
desc: {
ZhCn: string;
EnUs: string;
};
} }
export const notFound: NotFoundText = { export const notFound: NotFoundText = {
titleZhCn: '啊哦...请求出错了...', title: {
descZhCn: '请确保处于校网环境后,点击右上角 "...-重新进入小程序"', ZhCn: '啊哦...请求出错了...',
titleEnUs: 'Oops...Network Error...', EnUs: 'Oops...Network Error...',
descEnUs: },
'Please make sure you\'re in ZJU\'s school network environment and then click on the top right corner "... - re-enter the applet"!', desc: {
ZhCn: '请确保处于校网环境后,点击右上角 "...-重新进入小程序"',
EnUs: 'Please make sure you\'re in ZJU\'s school network environment and then click on the top right corner "... - re-enter the applet"!',
},
}; };

View File

@ -1,6 +1,12 @@
export interface MainPageText { export interface MainPageText {
mainTitleLine: string; normal: {
subTitleLine: string; recoverTime: string;
reason: string;
};
titleLine: {
main: string;
sub: string;
};
cardTitle: { cardTitle: {
dutyInfo: string; dutyInfo: string;
stepInfo: string; stepInfo: string;
@ -23,11 +29,6 @@ export interface MainPageText {
stepList: Array<{ title: string }>; stepList: Array<{ title: string }>;
tipsList: Array<{ title: string }>; tipsList: Array<{ title: string }>;
ticketList: {
title: string;
note: string;
};
dutyCard: { dutyCard: {
offDuty: { offDuty: {
title: string; title: string;
@ -36,15 +37,21 @@ export interface MainPageText {
}; };
inDuty: { inDuty: {
title: string; title: string;
currentDutyText: (c: 'off' | '1' | '2' | '3' | 'others') => string; currentDutyText: (c: '0' | '1' | '2' | '3' | 'others') => string;
inDutyCnt: (n: number) => string; inDutyCnt: (n: number) => string;
}; };
}; };
} }
export const mainPageZhCn: MainPageText = { export const mainPageZhCn: MainPageText = {
mainTitleLine: '您好这里是E志者协会', normal: {
subTitleLine: '维修请至【东三-204】实验室', recoverTime: '明天 13:30',
reason: '正常下班',
},
titleLine: {
main: '您好这里是E志者协会',
sub: '维修请至【东三-204】实验室',
},
cardTitle: { cardTitle: {
dutyInfo: '值班情况', dutyInfo: '值班情况',
stepInfo: '维修步骤', stepInfo: '维修步骤',
@ -76,10 +83,6 @@ export const mainPageZhCn: MainPageText = {
{ title: '204 也是实验室,请勿在内饮食~' }, { title: '204 也是实验室,请勿在内饮食~' },
{ title: '我们是志愿服务,不收取任何礼物哦~' }, { title: '我们是志愿服务,不收取任何礼物哦~' },
], ],
ticketList: {
title: '预填写工单列表',
note: '在这里查看所有的预填写工单!',
},
dutyCard: { dutyCard: {
offDuty: { offDuty: {
title: '未值班', title: '未值班',
@ -90,7 +93,7 @@ export const mainPageZhCn: MainPageText = {
title: '值班中', title: '值班中',
currentDutyText: (c) => { currentDutyText: (c) => {
switch (c) { switch (c) {
case 'off': case '0':
return '当前未值班'; return '当前未值班';
case '1': case '1':
return '第一班 13:30-16:00'; return '第一班 13:30-16:00';
@ -108,8 +111,14 @@ export const mainPageZhCn: MainPageText = {
}; };
export const mainPageEnUs: MainPageText = { export const mainPageEnUs: MainPageText = {
mainTitleLine: 'Hi! This is EVA.', normal: {
subTitleLine: 'For maintenance, please go to [204 Lab, E3 building]', recoverTime: 'Tomorrow 13:30',
reason: 'Normal shift',
},
titleLine: {
main: 'Hi! This is EVA.',
sub: 'For maintenance, please go to [204 Lab, E3 building]',
},
cardTitle: { cardTitle: {
dutyInfo: 'Duty Situation', dutyInfo: 'Duty Situation',
stepInfo: 'Maintenance Steps', stepInfo: 'Maintenance Steps',
@ -141,10 +150,6 @@ export const mainPageEnUs: MainPageText = {
{ title: '204 is also a laboratory. Do not eat inside.' }, { title: '204 is also a laboratory. Do not eat inside.' },
{ title: 'We are volunteers and do not take any gifts.' }, { title: 'We are volunteers and do not take any gifts.' },
], ],
ticketList: {
title: 'Pre-filling ticket list',
note: 'Browse for all pre-filling tickets here!',
},
dutyCard: { dutyCard: {
offDuty: { offDuty: {
title: 'Off Duty', title: 'Off Duty',
@ -155,8 +160,8 @@ export const mainPageEnUs: MainPageText = {
title: 'On Duty', title: 'On Duty',
currentDutyText: (c) => { currentDutyText: (c) => {
switch (c) { switch (c) {
case 'off': case '0':
return 'Currently not on duty'; return 'Normal Shift';
case '1': case '1':
return '1st Shift 13:30-16:00'; return '1st Shift 13:30-16:00';
case '2': case '2':

View File

@ -1,10 +1,16 @@
export interface MemberPageText { export interface MemberPageText {
mainTitleLine: string; titleLine: {
subTitleLine: string; main: {
loginMainTitleLine: string; index: string;
loginSubTitleLine: string; login: string;
logoutMainTitleLine: string; logout: string;
logoutSubTitleLine: string; };
sub: {
index: string;
login: string;
logout: string;
};
};
cardTitle: { cardTitle: {
dutyInfo: string; dutyInfo: string;
stepInfo: string; stepInfo: string;
@ -22,9 +28,6 @@ export interface MemberPageText {
title: string; title: string;
placeholder: string; placeholder: string;
}; };
uncompletedTicket: {
extra: string;
};
dutyCard: { dutyCard: {
offDuty: { offDuty: {
title: string; title: string;
@ -54,22 +57,33 @@ export interface MemberPageText {
}; };
stepList: Array<{ title: string }>; stepList: Array<{ title: string }>;
tipsList: Array<{ title: string }>; tipsList: Array<{ title: string }>;
ticketList: {
hint: string;
title: string;
note: string;
};
} }
export const memberPageZhCn: MemberPageText = { export const memberPageZhCn: MemberPageText = {
mainTitleLine: '您好,', titleLine: {
subTitleLine: '祝你满绩每一天', main: {
loginMainTitleLine: '协会成员登录入口', index: '您好,',
loginSubTitleLine: '请使用 EVA 统一身份认证,登录后点击下方按钮以扫描二维码', login: '协会成员登录入口',
logoutMainTitleLine: '协会成员登出', logout: '协会成员登出',
logoutSubTitleLine: '登出后须扫码重新登录!', },
sub: {
index: '祝你满绩每一天',
login: '请使用 EVA 统一身份认证,登录后点击下方按钮以扫描二维码',
logout: '登出后须扫码重新登录!',
},
},
cardTitle: { cardTitle: {
dutyInfo: '值班情况', dutyInfo: '值班情况',
stepInfo: '维修步骤', stepInfo: '维修步骤',
tipsInfo: '注意事项', tipsInfo: '注意事项',
}, },
dutyCount: { dutyCount: {
button: '更新值班人数', button: '更新',
text: '当前值班人数:', text: '当前值班人数:',
}, },
stuidText: { stuidText: {
@ -80,9 +94,6 @@ export const memberPageZhCn: MemberPageText = {
title: '密码', title: '密码',
placeholder: '与 EVA 统一身份认证一致', placeholder: '与 EVA 统一身份认证一致',
}, },
uncompletedTicket: {
extra: '详细信息',
},
dutyCard: { dutyCard: {
offDuty: { offDuty: {
title: '空闲', title: '空闲',
@ -135,23 +146,34 @@ export const memberPageZhCn: MemberPageText = {
{ title: '离开 204 前清点好维修物资!' }, { title: '离开 204 前清点好维修物资!' },
{ title: '螺丝上了吗?电源排线插了吗?' }, { title: '螺丝上了吗?电源排线插了吗?' },
], ],
ticketList: {
hint: '七日内未完成工单',
title: '预填写工单列表',
note: '在这里查看所有的预填写工单!',
},
}; };
export const memberPageEnUs: MemberPageText = { export const memberPageEnUs: MemberPageText = {
mainTitleLine: 'Hi! ', titleLine: {
subTitleLine: 'Have a great day!', main: {
loginMainTitleLine: 'EVA Member Entry', index: 'Hi! ',
loginSubTitleLine: login: 'EVA Member Entry',
'Please use EVA Auth, log in and click the button below to scan the QR code', logout: 'EVA Member Logout',
logoutMainTitleLine: 'EVA Member Logout', },
logoutSubTitleLine: 'After logging out, scan the code again to log back in!', sub: {
index: 'Have a great day!',
login:
'Please use EVA Auth, log in and click the button below to scan the QR code',
logout: 'After logging out, scan the code again to log back in!',
},
},
cardTitle: { cardTitle: {
dutyInfo: 'Duty Situation', dutyInfo: 'Duty Situation',
stepInfo: 'Maintenance Steps', stepInfo: 'Maintenance Steps',
tipsInfo: 'Tips', tipsInfo: 'Tips',
}, },
dutyCount: { dutyCount: {
button: 'Update Duty Count', button: 'Update',
text: 'The duty count: ', text: 'The duty count: ',
}, },
stuidText: { stuidText: {
@ -162,9 +184,6 @@ export const memberPageEnUs: MemberPageText = {
title: 'Password', title: 'Password',
placeholder: 'Consistent with EVA Auth', placeholder: 'Consistent with EVA Auth',
}, },
uncompletedTicket: {
extra: 'Details',
},
dutyCard: { dutyCard: {
offDuty: { offDuty: {
title: 'Off Duty', title: 'Off Duty',
@ -221,4 +240,9 @@ export const memberPageEnUs: MemberPageText = {
{ title: '204 is a laboratory. Do not eat inside.' }, { title: '204 is a laboratory. Do not eat inside.' },
{ title: 'Are the screws on? Is the power cable plugged in?' }, { title: 'Are the screws on? Is the power cable plugged in?' },
], ],
ticketList: {
hint: 'Uncompleted tickets in 7 days',
title: 'Pre-filling ticket list',
note: 'Browse for all pre-filling tickets here!',
},
}; };

View File

@ -4,6 +4,8 @@ export interface RepairPageText {
title: string; title: string;
note: string; note: string;
extra: string; extra: string;
hint: string;
nohint: string;
}; };
typeText: { typeText: {
computer: string; computer: string;
@ -51,6 +53,8 @@ export const repairPageZhCn: RepairPageText = {
title: '', title: '',
note: '', note: '',
extra: '详细信息', extra: '详细信息',
hint: '我正在进行的工单',
nohint: '暂无进行中的工单',
}, },
typeText: { typeText: {
computer: '电脑', computer: '电脑',
@ -98,6 +102,8 @@ export const repairPageEnUs: RepairPageText = {
title: '', title: '',
note: '', note: '',
extra: 'Details', extra: 'Details',
hint: 'My continuing tickets',
nohint: 'No continuing tickets',
}, },
typeText: { typeText: {
computer: 'Computer', computer: 'Computer',

View File

@ -6,35 +6,39 @@ type StatusStr = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7';
export interface TicketDetailText { export interface TicketDetailText {
stepItems: Array<StepItem>; stepItems: Array<StepItem>;
createTicketMessage: string;
statusModifyPrefix: string;
statusModifyMessage: Map<StatusStr, string>; statusModifyMessage: Map<StatusStr, string>;
descTitle: string; desc: {
title: string;
};
divider: string; divider: string;
info: { info: {
title: string; title: string;
extra: string; extra: string;
}; };
tookAway: string; button: {
addToOreo: string; tookAway: string;
addNote: string; addToOreo: string;
pick: string; addNote: string;
pick: string;
status: string;
};
reminder: {
title: string;
error: string;
r0: string;
r1: string;
r2: string;
r3: string;
};
comment: { comment: {
title: string; title: string;
placeholder: string; placeholder: string;
createTicketMessage: string;
statusModifyPrefix: string;
}; };
status: { status: {
button: string;
title: string; title: string;
cancel: string; cancel: string;
status0: string;
status1: string;
status2: string;
status3: string;
status4: string;
status5: string;
status6: string;
status7: string;
}; };
} }
@ -45,8 +49,6 @@ export const ticketDetailZhCn: TicketDetailText = {
{ title: '待取回' }, { title: '待取回' },
{ title: '工单完成' }, { title: '工单完成' },
], ],
createTicketMessage: '创建了维修',
statusModifyPrefix: '将维修状态改为:',
statusModifyMessage: new Map<StatusStr, string>([ statusModifyMessage: new Map<StatusStr, string>([
['0', '已创建/交接中'], ['0', '已创建/交接中'],
['1', '维修中'], ['1', '维修中'],
@ -57,32 +59,38 @@ export const ticketDetailZhCn: TicketDetailText = {
['6', '维修翻车待取回'], ['6', '维修翻车待取回'],
['7', '维修翻车已取回'], ['7', '维修翻车已取回'],
]), ]),
descTitle: '问题描述', desc: {
divider: '评论 / 状态', title: '问题描述',
},
info: { info: {
title: '机主姓名', title: '机主姓名',
extra: '联系方式', extra: '联系方式',
}, },
tookAway: '我已取回', divider: '评论 / 状态',
addToOreo: '加入 Oreo', button: {
addNote: '添加评论', tookAway: '我已取回',
pick: '认领', addToOreo: '加入 Oreo',
addNote: '添加评论',
pick: '认领',
status: '改变状态',
},
comment: { comment: {
title: '添加评论', title: '添加评论',
placeholder: '可以在这里交流机器情况、维修进度、提出问题~', placeholder: '可以在这里交流机器情况、维修进度、提出问题~',
createTicketMessage: '创建了维修',
statusModifyPrefix: '将维修状态改为:',
},
reminder: {
title: '注意事项!',
error: '请重新确认机器状况!',
r0: '是否进行维修?',
r1: '螺丝是否装回?排线是否插好?',
r2: '维修后机器是否已正常运行?',
r3: '随机附件是否已经归还?',
}, },
status: { status: {
button: '改变工单状态',
title: '请选择要改变成为的状态', title: '请选择要改变成为的状态',
cancel: '取消', cancel: '取消',
status0: '已创建/交接中',
status1: '维修中',
status2: '劝退待取回',
status3: '劝退已取回',
status4: '维修成功待取回',
status5: '维修成功已取回',
status6: '维修翻车待取回',
status7: '维修翻车已取回',
}, },
}; };
@ -93,8 +101,6 @@ export const ticketDetailEnUs: TicketDetailText = {
{ title: 'Finished' }, { title: 'Finished' },
{ title: 'Retrieved' }, { title: 'Retrieved' },
], ],
createTicketMessage: 'Created ticket',
statusModifyPrefix: 'Modified repair status to: ',
statusModifyMessage: new Map<StatusStr, string>([ statusModifyMessage: new Map<StatusStr, string>([
['0', 'Created / Handovering'], ['0', 'Created / Handovering'],
['1', 'Repairing'], ['1', 'Repairing'],
@ -105,32 +111,38 @@ export const ticketDetailEnUs: TicketDetailText = {
['6', 'Pending Retrieval (Failed)'], ['6', 'Pending Retrieval (Failed)'],
['7', 'Retrieved (Failed)'], ['7', 'Retrieved (Failed)'],
]), ]),
descTitle: 'Description', desc: {
divider: 'Comment / Status', title: 'Description',
},
info: { info: {
title: 'Name', title: 'Name',
extra: 'Contact', extra: 'Contact',
}, },
tookAway: 'Already retrieved', divider: 'Comment / Status',
addToOreo: 'Add to Oreo', button: {
addNote: 'Comment', tookAway: 'Already retrieved',
pick: 'Pick', addToOreo: 'Add to Oreo',
addNote: 'Comment',
pick: 'Pick',
status: 'Change status',
},
comment: { comment: {
title: 'Add Comment', title: 'Add comment',
placeholder: placeholder:
'You can exchange information the device, the progress of repairs, and ask questions here.', 'You can exchange information the device, the progress of repairs, and ask questions here.',
createTicketMessage: 'Created ticket',
statusModifyPrefix: 'Modified repair status to: ',
},
reminder: {
title: 'Reminder',
error: 'Please re-confirm the status of the device!',
r0: 'Is the maintenance performed?',
r1: 'Are the srews on? Is the power cable plugged in?',
r2: 'Did the device operate well after maintenance?',
r3: 'Are the attachments reverted?',
}, },
status: { status: {
button: 'Modify Status',
title: 'Please select the status you want to modify to', title: 'Please select the status you want to modify to',
cancel: 'Cancel', cancel: 'Cancel',
status0: 'Created / Handovering',
status1: 'Repairing',
status2: 'Pending Retrieval (Refused)',
status3: 'Retrieved (Refused)',
status4: 'Pending Retrieval (Finished)',
status5: 'Retrieved (Finished)',
status6: 'Pending Retrieval (Failed)',
status7: 'Retrieved (Failed)',
}, },
}; };

View File

@ -1,7 +1,7 @@
export interface UserPageText { export interface UserPageText {
memberEntry: { memberEntry: {
front: string; prefix: string;
behind: string; affix: string;
}; };
ticketColumn: { ticketColumn: {
title: string; title: string;
@ -27,8 +27,8 @@ export interface UserPageText {
export const userPageZhCn: UserPageText = { export const userPageZhCn: UserPageText = {
memberEntry: { memberEntry: {
front: '再点击 ', prefix: '再点击 ',
behind: ' 次以进入协会成员登录页面', affix: ' 次以进入协会成员登录页面',
}, },
ticketColumn: { ticketColumn: {
title: '我的工单', title: '我的工单',
@ -54,8 +54,8 @@ export const userPageZhCn: UserPageText = {
export const userPageEnUs: UserPageText = { export const userPageEnUs: UserPageText = {
memberEntry: { memberEntry: {
front: 'Click ', prefix: 'Click ',
behind: ' more times to enter member login page', affix: ' more times to enter member login page',
}, },
ticketColumn: { ticketColumn: {
title: 'My Tickets', title: 'My Tickets',

View File

@ -6,7 +6,10 @@ import { getUrl } from '.';
export function addToOreo(that: TicketDetail) { export function addToOreo(that: TicketDetail) {
that.setState({ that.setState({
isOreoLoading: true, isLoading: {
...that.state.isLoading,
oreo: true,
},
}); });
Taro.request({ Taro.request({
url: getUrl('/tickets/addtooreo'), url: getUrl('/tickets/addtooreo'),
@ -19,7 +22,10 @@ export function addToOreo(that: TicketDetail) {
.then((res) => { .then((res) => {
console.log(res.data); console.log(res.data);
that.setState({ that.setState({
isOreoLoading: false, isLoading: {
...that.state.isLoading,
oreo: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.success, message: pt.get().button.submitText.success,
@ -29,7 +35,10 @@ export function addToOreo(that: TicketDetail) {
.catch((err) => { .catch((err) => {
console.log(err.errMsg); console.log(err.errMsg);
that.setState({ that.setState({
isOreoLoading: false, isLoading: {
...that.state.isLoading,
oreo: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.error + err.errMsg, message: pt.get().button.submitText.error + err.errMsg,

View File

@ -6,9 +6,12 @@ import { getUrl } from '.';
const reLaunchInterval = 1000; const reLaunchInterval = 1000;
export function changeStatus(that: TicketDetail, status: number) { export function changeStatus(that: TicketDetail) {
that.setState({ that.setState({
isStatusLoading: true, isLoading: {
...that.state.isLoading,
status: true,
},
}); });
Taro.request({ Taro.request({
url: getUrl('/tickets/update'), url: getUrl('/tickets/update'),
@ -16,13 +19,16 @@ export function changeStatus(that: TicketDetail, status: number) {
data: { data: {
token: wechatUser.getToken(), token: wechatUser.getToken(),
id: that.state.id, id: that.state.id,
status: status, status: that.state.statusToBe,
}, },
}) })
.then((res) => { .then((res) => {
console.log(res.data); console.log(res.data);
that.setState({ that.setState({
isStatusLoading: false, isLoading: {
...that.state.isLoading,
status: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.success, message: pt.get().button.submitText.success,
@ -37,7 +43,10 @@ export function changeStatus(that: TicketDetail, status: number) {
.catch((err) => { .catch((err) => {
console.log(err.errMsg); console.log(err.errMsg);
that.setState({ that.setState({
isStatusLoading: false, isLoading: {
...that.state.isLoading,
status: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.error + err.errMsg, message: pt.get().button.submitText.error + err.errMsg,

View File

@ -16,19 +16,21 @@ export function getCurrentTicket(that: RepairPage) {
.then((res) => { .then((res) => {
const data = res.data.data; const data = res.data.data;
let newIdNameList: Array<Map<number, string>> = []; let newIdNameList: Array<Map<number, string>> = [];
data.list.map((ticket: TicketListItem) => { if (data.list.length !== 0) {
if ( data.list.map((ticket: TicketListItem) => {
ticket['status'] !== 3 && if (
ticket['status'] !== 5 && ticket['status'] !== 3 &&
ticket['status'] !== 7 ticket['status'] !== 5 &&
) { ticket['status'] !== 7
newIdNameList.push( ) {
new Map([ newIdNameList.push(
[ticket['id'], ticket['device'] + ' ' + ticket['deviceModel']], new Map([
]), [ticket['id'], ticket['device'] + ' ' + ticket['deviceModel']],
); ]),
} );
}); }
});
}
that.setState({ that.setState({
currentTicketsIdName: newIdNameList, currentTicketsIdName: newIdNameList,
}); });

View File

@ -20,28 +20,10 @@ export function getDutyInfo(that: MainPage) {
return; return;
} }
const data = res.data.data; const data = res.data.data;
if (data.isInDuty) { that.setState({
that.setState({ rs: former.trans(true),
rs: former.trans(true), dutyData: data,
dutyData: { });
isInDuty: data.isInDuty,
inDutyCnt: data.inDutyCnt,
currentDuty: data.currentDuty,
otherDutyTime: data.otherDutyTime,
place: data.place,
},
});
} else {
that.setState({
rs: former.trans(true),
dutyData: {
isInDuty: data.isInDuty,
offDutyReason: data.offDutyReason,
dutyRecoverTime: data.dutyRecoverTime,
place: data.place,
},
});
}
}) })
.catch((err) => { .catch((err) => {
console.log(err.errMsg); console.log(err.errMsg);

View File

@ -13,19 +13,24 @@ export function getDisable(that: TicketDetail, id: number) {
}) })
.then((res) => { .then((res) => {
const data = res.data.data; const data = res.data.data;
let isDisable_main = that.state.isDisable_main;
if (data.status === 3 || data.status === 5 || data.status === 7) { if (data.status === 3 || data.status === 5 || data.status === 7) {
that.setState({ isDisable_main.retrieve = true;
isRetrieveDisable_main: true, isDisable_main.comment = true;
isCommentDisable_main: true,
});
} }
if (wechatUser.getAccess()) { if (wechatUser.getAccess()) {
if (data.workers.includes(wechatUser.getInfo().name)) { if (data.workers.includes(wechatUser.getInfo().name)) {
that.setState({ isDisable_main.pick = true;
isPickDisable_main: true,
});
} }
} }
that.setState({
isDisable_main: {
...that.state.isDisable_main,
retrieve: isDisable_main.retrieve,
comment: isDisable_main.comment,
pick: isDisable_main.pick,
},
});
}) })
.catch((reason) => { .catch((reason) => {
console.log(reason.errMsg); console.log(reason.errMsg);

View File

@ -8,7 +8,10 @@ const reLaunchInterval = 1000;
export function pickTicket(that: TicketDetail) { export function pickTicket(that: TicketDetail) {
that.setState({ that.setState({
isPickLoading: true, isLoading: {
...that.state.isLoading,
pick: true,
},
}); });
Taro.request({ Taro.request({
url: getUrl('/tickets/pick'), url: getUrl('/tickets/pick'),
@ -21,7 +24,10 @@ export function pickTicket(that: TicketDetail) {
.then((res) => { .then((res) => {
console.log(res.data); console.log(res.data);
that.setState({ that.setState({
isPickLoading: false, isLoading: {
...that.state.isLoading,
pick: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.success, message: pt.get().button.submitText.success,
@ -36,7 +42,10 @@ export function pickTicket(that: TicketDetail) {
.catch((err) => { .catch((err) => {
console.log(err.errMsg); console.log(err.errMsg);
that.setState({ that.setState({
isPickLoading: false, isLoading: {
...that.state.isLoading,
pick: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.error + err.errMsg, message: pt.get().button.submitText.error + err.errMsg,

View File

@ -8,7 +8,10 @@ const reLaunchInterval = 1000;
export function retrieve(that: TicketDetail) { export function retrieve(that: TicketDetail) {
that.setState({ that.setState({
isRetrieveLoading: true, isLoading: {
...that.state.isLoading,
retrieve: true,
},
}); });
Taro.request({ Taro.request({
url: getUrl('/tickets/retrieve'), url: getUrl('/tickets/retrieve'),
@ -21,7 +24,10 @@ export function retrieve(that: TicketDetail) {
.then((res) => { .then((res) => {
console.log(res.data); console.log(res.data);
that.setState({ that.setState({
isRetrieveLoading: false, isLoading: {
...that.state.isLoading,
retrieve: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.success, message: pt.get().button.submitText.success,
@ -36,7 +42,10 @@ export function retrieve(that: TicketDetail) {
.catch((err) => { .catch((err) => {
console.log(err.errMsg); console.log(err.errMsg);
that.setState({ that.setState({
isRetrieveLoading: false, isLoading: {
...that.state.isLoading,
retrieve: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.error + err.errMsg, message: pt.get().button.submitText.error + err.errMsg,

View File

@ -8,7 +8,10 @@ const reLaunchInterval = 1000;
export function submitComment(that: TicketDetail) { export function submitComment(that: TicketDetail) {
that.setState({ that.setState({
isCommentLoading: true, isLoading: {
...that.state.isLoading,
comment: true,
},
}); });
Taro.request({ Taro.request({
url: getUrl('/report'), url: getUrl('/report'),
@ -21,7 +24,10 @@ export function submitComment(that: TicketDetail) {
.then((res) => { .then((res) => {
console.log(res.data); console.log(res.data);
that.setState({ that.setState({
isCommentLoading: false, isLoading: {
...that.state.isLoading,
comment: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.success, message: pt.get().button.submitText.success,
@ -36,7 +42,10 @@ export function submitComment(that: TicketDetail) {
.catch((err) => { .catch((err) => {
console.log(err.errMsg); console.log(err.errMsg);
that.setState({ that.setState({
isCommentLoading: false, isLoading: {
...that.state.isLoading,
comment: false,
},
}); });
Taro.atMessage({ Taro.atMessage({
message: pt.get().button.submitText.error + err.errMsg, message: pt.get().button.submitText.error + err.errMsg,