Browse Source

feat(front): 个人中心提问

Go 5 years ago
parent
commit
6ffa7a2fc9
30 changed files with 377 additions and 224 deletions
  1. 4 4
      front/project/Constant.js
  2. 1 4
      front/project/admin/routes/course/invoice/page.js
  3. 3 3
      front/project/h5/stores/my.js
  4. 1 1
      front/project/www/routes/exercise/list/page.js
  5. 6 0
      front/project/www/routes/my/answer/index.less
  6. 33 75
      front/project/www/routes/my/answer/page.js
  7. 25 12
      front/project/www/routes/my/collect/page.js
  8. 74 33
      front/project/www/routes/my/course/page.js
  9. 3 3
      front/project/www/routes/paper/question/detail/index.js
  10. 1 2
      front/project/www/routes/paper/question/page.js
  11. 39 36
      front/project/www/routes/paper/report/page.js
  12. 3 3
      front/project/www/stores/my.js
  13. 1 1
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserAskQuestionRelationMapper.xml
  14. 1 1
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserCollectQuestionRelationMapper.xml
  15. 1 1
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserNoteQuestionRelationMapper.xml
  16. 3 3
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml
  17. 27 9
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserController.java
  18. 12 7
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  19. 13 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/InvoiceDownloadDto.java
  20. 13 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/InvoiceFinishDto.java
  21. 25 1
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserInvoiceListDto.java
  22. 9 9
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionExtendDto.java
  23. 20 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperBaseExtendDto.java
  24. 20 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperDetailExtendDto.java
  25. 20 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserReportExtendDto.java
  26. 10 10
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserAskQuestionDto.java
  27. 3 1
      server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java
  28. 3 4
      server/gateway-api/src/main/java/com/qxgmat/service/UserNoteQuestionService.java
  29. 1 1
      server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java
  30. 2 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserInvoiceService.java

File diff suppressed because it is too large
+ 4 - 4
front/project/Constant.js


+ 1 - 4
front/project/admin/routes/course/invoice/page.js

@@ -110,10 +110,7 @@ export default class extends Page {
   downloadAction() {
     const { selectedKeys } = this.state;
     asyncDelConfirm('下载确认', '是否下载选中记录?', () => {
-      return User.downloadInvoice({ ids: selectedKeys }).then(() => {
-        asyncSMessage('操作成功!');
-        this.refresh();
-      });
+      openLink(`/api/user/invoice/download?${selectedKeys.map(row => `ids=${row}`).join('&')}`);
     });
   }
 

+ 3 - 3
front/project/h5/stores/my.js

@@ -256,14 +256,14 @@ export default class MyStore extends BaseStore {
 
   /**
    * 添加题目提问
-   * @param {*} userPaperId : 用于获取预习作业,判断权限
+   * @param {*} userQuestionId : 用于获取预习作业,判断权限
    * @param {*} target
    * @param {*} questionModule
    * @param {*} questionNoId
    * @param {*} content
    */
-  addQuestionAsk(userPaperId, target, questionModule, questionNoId, originContent, content) {
-    return this.apiPost('/my/ask/question', { userPaperId, target, questionModule, questionNoId, originContent, content });
+  addQuestionAsk(userQuestionId, target, questionModule, questionNoId, originContent, content) {
+    return this.apiPost('/my/ask/question', { userQuestionId, target, questionModule, questionNoId, originContent, content });
   }
 
   /**

+ 1 - 1
front/project/www/routes/exercise/list/page.js

@@ -33,7 +33,7 @@ export default class extends Page {
           <div className="table-row">
             <div className="night f-s-16">{record.title}</div>
             <div>
-              <ProgressText progress={progress} size="small" />
+              <ProgressText progress={progress} times={record.paper ? record.paper.times : 0} size="small" />
             </div>
           </div>
         );

+ 6 - 0
front/project/www/routes/my/answer/index.less

@@ -52,6 +52,12 @@
 
         .group {
           display: inline-block;
+
+          &.text-hidden {
+            white-space: nowrap;
+            text-overflow: ellipsis;
+            overflow: hidden;
+          }
         }
 
         .sub {

File diff suppressed because it is too large
+ 33 - 75
front/project/www/routes/my/answer/page.js


+ 25 - 12
front/project/www/routes/my/collect/page.js

@@ -2,7 +2,7 @@ import React, { Component } from 'react';
 import './index.less';
 import { Icon, Checkbox } from 'antd';
 import Page from '@src/containers/Page';
-import { timeRange } from '@src/services/Tools';
+import { timeRange, getMap } from '@src/services/Tools';
 import UserLayout from '../../../layouts/User';
 import UserTable from '../../../components/UserTable';
 import UserAction from '../../../components/UserAction';
@@ -11,12 +11,25 @@ import Tabs from '../../../components/Tabs';
 import Modal from '../../../components/Modal';
 import Select from '../../../components/Select';
 import GIcon from '../../../components/Icon';
-import { TimeRange } from '../../../../Constant';
+import { TimeRange, QuestionType } from '../../../../Constant';
 import { My } from '../../../stores/my';
 
+const QuestionTypeMap = getMap(QuestionType, 'value', 'label');
+
 const columns = [
-  { key: 'question_type', title: '题型', fixSort: true },
-  { key: 'title', title: '题目ID', fixSort: true },
+  {
+    key: 'question_type',
+    title: '题型',
+    render: (text, record) => {
+      return QuestionTypeMap[record.questionType];
+    },
+    fixSort: true,
+  },
+  {
+    key: 'title',
+    title: '题目ID',
+    fixSort: true,
+  },
   {
     key: 'description',
     title: '内容',
@@ -153,7 +166,7 @@ export default class extends Page {
     }
   }
 
-  onAction() {}
+  onAction() { }
 
   onSelect(selectList) {
     this.setState({ selectList });
@@ -311,7 +324,7 @@ export default class extends Page {
   renderModal() {
     return [
       <ArticleDetail show={this.state.showDetail} onClose={() => this.setState({ showDetail: false })} />,
-      <Modal title="操作提示" confirmText="好的,知道了" btnAlign="center" onConfirm={() => {}}>
+      <Modal title="操作提示" confirmText="好的,知道了" btnAlign="center" onConfirm={() => { }}>
         <div className="flex-layout m-b-2">
           <div className="flex-block">
             <div className="t-1 t-s-18">组卷功能</div>
@@ -331,10 +344,10 @@ export default class extends Page {
           查阅以上信息。
         </div>
       </Modal>,
-      <Modal title="组卷练习" confirmText="好的,知道了" btnAlign="center" onConfirm={() => {}}>
+      <Modal title="组卷练习" confirmText="好的,知道了" btnAlign="center" onConfirm={() => { }}>
         <div className="t-2 t-s-18">不可同时选中语文题和数学题,请重新选择。</div>
       </Modal>,
-      <Modal title="组卷练习" confirmText="开始练习" onConfirm={() => {}} onCancel={() => {}}>
+      <Modal title="组卷练习" confirmText="开始练习" onConfirm={() => { }} onCancel={() => { }}>
         <div className="t-2 t-s-18">
           您共选择了 <span className="t-4">50</span> 道题目,是否开始练习?
         </div>
@@ -348,15 +361,15 @@ export default class extends Page {
           次以上的错题
         </div>
       </Modal>,
-      <Modal title="移出" onConfirm={() => {}} onCancel={() => {}}>
+      <Modal title="移出" onConfirm={() => { }} onCancel={() => { }}>
         <div className="t-2 t-s-18">
           当前选中的 <span className="t-4">50</span> 道题即将被移出错题本,移出后无法恢复,是否继续?
         </div>
       </Modal>,
-      <Modal title="导出" confirmText="好的,知道了" btnAlign="center" onConfirm={() => {}}>
+      <Modal title="导出" confirmText="好的,知道了" btnAlign="center" onConfirm={() => { }}>
         <div className="t-2 t-s-18">正在下载中,请不要关闭当前页面!</div>
       </Modal>,
-      <Modal title="导出" confirmText="导出" onConfirm={() => {}} onCancel={() => {}}>
+      <Modal title="导出" confirmText="导出" onConfirm={() => { }} onCancel={() => { }}>
         <div className="t-2 t-s-18 m-b-5">
           当前共选中 <span className="t-4">50</span> 道题,请确认需要导出的内容:
         </div>
@@ -371,7 +384,7 @@ export default class extends Page {
           })}
         </div>
       </Modal>,
-      <Modal title="导出" confirmText="导出" onConfirm={() => {}} onCancel={() => {}}>
+      <Modal title="导出" confirmText="导出" onConfirm={() => { }} onCancel={() => { }}>
         <div className="t-2 t-s-18 m-b-5">
           当前共选中 <span className="t-4">50</span> 道题,请确认需要导出的内容:
         </div>

+ 74 - 33
front/project/www/routes/my/course/page.js

@@ -20,6 +20,8 @@ import Modal from '../../../components/Modal';
 import DatePlane from '../../../components/Date';
 import Note from '../../../components/Note';
 import { My } from '../../../stores/my';
+import { User } from '../../../stores/user';
+import { Question } from '../../../stores/question';
 import { Order } from '../../../stores/order';
 import { Common } from '../../../stores/common';
 
@@ -609,28 +611,47 @@ class CourseOnline extends Component {
       {
         title: '预习作业',
         key: 'paper',
-        render: (text, record) => {
-          const { paper = {} } = record;
-          return `${paper.paper && paper.paper.times > 0 ? `${paper.paper.times}次+` : ''}${
-            paper.report ? formatPercent(paper.report.userNumber, paper.report.questionNumber, false) : '0%'
-          }`;
+        render: (text) => {
+          const progress = text.report ? formatPercent(text.report.userNumber, text.report.questionNumber) : 0;
+          const times = text.paper ? text.paper.times : 0;
+          return <div>
+            <div className="v-a-m d-i-b">
+              <ProgressText width={50} size="small" times={times} progress={progress} unit="次" />
+            </div>
+            {!text.report && <IconButton className="m-l-2" type="start" tip="Start" onClick={() => {
+              User.needLogin()
+                .then(() => {
+                  Question.startLink('preview', text);
+                });
+            }} />}
+            {text.report && !text.report.isFinish && <IconButton className="m-l-2" type="continue" tip="Continue" onClick={() => {
+              User.needLogin()
+                .then(() => {
+                  Question.continueLink('preview', text);
+                });
+            }} />}
+            {text.report && !!text.report.isFinish && <IconButton className="m-l-2" type="restart" tip="Restart" onClick={() => {
+              User.needLogin()
+                .then(() => {
+                  Question.restart('preview', text);
+                });
+            }} />}
+            {text.report && !!text.report.isFinish && <IconButton className="m-l-5" type="report" tip="Report" onClick={() => {
+              User.needLogin()
+                .then(() => {
+                  Question.reportLink('preview', text);
+                });
+            }} />}
+          </div>;
         },
       },
       {
         title: '进度',
         key: 'progress',
         render: (text, record) => {
-          return record.progress ? (
-            <div>
-              <div className="v-a-m d-i-b">
-                <ProgressText width={50} size="small" times={1} progress={20} unit="次" />
-              </div>
-              <IconButton className="m-l-2" type="start" />
-              <IconButton className="m-l-5" type="report" />
-            </div>
-          ) : (
-            '-'
-          );
+          const { paper = {} } = record;
+          return `${paper.paper && paper.paper.times > 0 ? `${paper.paper.times}次+` : ''}${
+            paper.report ? formatPercent(paper.report.userNumber, paper.report.questionNumber, false) : '0%'}`;
         },
       },
       {
@@ -659,7 +680,7 @@ class CourseOnline extends Component {
         },
       },
     ];
-    this.state = { open: false };
+    this.state = { open: props.data.status === 'ing' };
   }
 
   render() {
@@ -1001,18 +1022,38 @@ class CourseVs extends Component {
         {
           title: '预习作业',
           key: 'paper',
-          render: (text, record) => {
-            return record.progress ? (
-              <div>
-                <div className="v-a-m d-i-b">
-                  <ProgressText width={50} size="small" times={1} progress={20} unit="次" />
-                </div>
-                <IconButton className="m-l-2" type="start" />
-                <IconButton className="m-l-5" type="report" />
+          render: (text) => {
+            const progress = text.report ? formatPercent(text.report.userNumber, text.report.questionNumber) : 0;
+            const times = text.paper ? text.paper.times : 0;
+            return <div>
+              <div className="v-a-m d-i-b">
+                <ProgressText width={50} size="small" times={times} progress={progress} unit="次" />
               </div>
-            ) : (
-              '-'
-            );
+              {!text.report && <IconButton className="m-l-2" type="start" tip="Start" onClick={() => {
+                User.needLogin()
+                  .then(() => {
+                    Question.startLink('preview', text);
+                  });
+              }} />}
+              {text.report && !text.report.isFinish && <IconButton className="m-l-2" type="continue" tip="Continue" onClick={() => {
+                User.needLogin()
+                  .then(() => {
+                    Question.continueLink('preview', text);
+                  });
+              }} />}
+              {text.report && !!text.report.isFinish && <IconButton className="m-l-2" type="restart" tip="Restart" onClick={() => {
+                User.needLogin()
+                  .then(() => {
+                    Question.restart('preview', text);
+                  });
+              }} />}
+              {text.report && !!text.report.isFinish && <IconButton className="m-l-5" type="report" tip="Report" onClick={() => {
+                User.needLogin()
+                  .then(() => {
+                    Question.reportLink('preview', text);
+                  });
+              }} />}
+            </div>;
           },
         },
         {
@@ -1026,14 +1067,14 @@ class CourseVs extends Component {
           title: '课后笔记',
           key: 'note',
           render: (text, record) => {
-            return <a onClick={() => this.props.onNote(record)}>查看</a>;
+            return record.noteList ? <a onClick={() => this.props.onNote(record)}>查看</a> : <span>查看</span>;
           },
         },
         {
           title: '课后补充',
           key: 'supply',
           render: (text, record) => {
-            return <a onClick={() => this.props.onSupply(record)}>查看</a>;
+            return record.supplyList ? <a onClick={() => this.props.onSupply(record)}>查看</a> : <span>查看</span>;
           },
         },
       ],
@@ -1061,7 +1102,7 @@ class CourseVs extends Component {
           title: '课后补充',
           key: 'supply',
           render: (text, record) => {
-            return <a onClick={() => this.props.onSupply(record)}>查看</a>;
+            return record.supplyList ? <a onClick={() => this.props.onSupply(record)}>查看</a> : <span>查看</span>;
           },
         },
       ],
@@ -1075,13 +1116,13 @@ class CourseVs extends Component {
     };
     const index = props.data.appointments.length - 1;
     this.state = {
-      open: false,
+      open: props.data.status === 'ing',
       tab: 'ing',
       index,
       list: this.listMap[this.props.data.course.vsType],
       showTips:
         props.data.commentTips === 0 &&
-        (props.data.appointments.length === parseInt(props.data.number / 2, 10) ||
+        (props.data.appointments.length === Math.ceil(props.data.number / 2) ||
           props.data.appointments.length === props.data.number),
     };
   }

+ 3 - 3
front/project/www/routes/paper/question/detail/index.js

@@ -53,10 +53,10 @@ export default class extends Component {
   }
 
   submitAsk() {
-    const { question = {}, questionNo = {}, paper = {} } = this.props;
+    const { userQuestion, questionNo = {} } = this.props;
     const { ask = {} } = this.state;
     if (ask.originContent === '' || ask.content === '' || ask.target === '') return;
-    My.addQuestionAsk(paper.id, ask.target, question.questionModule, questionNo.id, ask.originContent, ask.content).then(() => {
+    My.addQuestionAsk(userQuestion.id, ask.target, userQuestion.questionModule, questionNo.id, ask.originContent, ask.content).then(() => {
       this.setState({ askModal: false, askOkModal: true });
     }).catch(err => {
       this.setState({ askError: err.message });
@@ -227,7 +227,7 @@ export default class extends Component {
           <AnswerButton className="item" onClick={() => this.setState({ noteModal: true })}>笔记</AnswerButton>
           {questionStatus >= 0 && <AnswerButton className="item" onClick={() => {
             if (questionStatus > 0) {
-              this.setState({ askModal: true });
+              this.setState({ askModal: true, ask: { target: AskTarget[0].value } });
             } else {
               this.setState({ askFailModal: true });
             }

+ 1 - 2
front/project/www/routes/paper/question/page.js

@@ -50,7 +50,6 @@ export default class extends Page {
     const { search } = this.state;
     Question.getDetailById(id).then(userQuestion => {
       const { question, questionNos, paper, note, report, setting, questionStatus } = userQuestion;
-      paper.paperModule = 'examination';
       let { questionNo } = userQuestion;
       if (!questionNo) ([questionNo] = questionNos);
       if (!question.answer) question.answer = { questions: [] };
@@ -83,7 +82,7 @@ export default class extends Page {
         const askId = Number(search.askId);
         userQuestion.asks = (userQuestion.asks || []).filter(row => row.askId === askId);
       }
-      this.setState({ userQuestion, question, questionNo, note, paper, questionNos, questionStatus });
+      this.setState({ userQuestion, question, questionNo, note, paper, report, questionNos, questionStatus });
     });
   }
 

+ 39 - 36
front/project/www/routes/paper/report/page.js

@@ -932,7 +932,9 @@ export default class extends Page {
 
   renderExerciseDetail() {
     const { report = {} } = this.state;
-    const { detail = {} } = report;
+    let { detail = {} } = report;
+    detail = detail || {};
+    const { pace = [], info = {}, difficult = [], place = [], limit = {} } = detail;
     return <div>
       <div className="body">
         <div className="content">
@@ -940,23 +942,23 @@ export default class extends Page {
           <div className="detail">
             <div className="block">
               <div className="t1">总耗时</div>
-              <div className="t2">{formatMinute(detail.info.userTime, true)}</div>
+              <div className="t2">{formatMinute(info.userTime, true)}</div>
               <div className="t3">min</div>
             </div>
-            {detail.info.userTime > detail.info.time && <div className="block">
+            {info.userTime > info.time && <div className="block">
               <div className="t1">超出建议用时</div>
-              <div className="t2">{formatMinute(detail.info.userTime - detail.info.time, true)}</div>
+              <div className="t2">{formatMinute(info.userTime - info.time, true)}</div>
               <div className="t3">min</div>
             </div>}
             <div className="line" />
             <div className="block">
               <div className="t1">完成题目</div>
-              <div className="t2">{detail.info.userNumber}</div>
+              <div className="t2">{info.userNumber}</div>
               <div className="t3">题</div>
             </div>
-            {detail.info.userNumber !== detail.info.questionNumber && <div className="block">
+            {info.userNumber !== info.questionNumber && <div className="block">
               <div className="t1">剩余未做</div>
-              <div className="t2">{detail.info.questionNumber - detail.info.userNumber}</div>
+              <div className="t2">{info.questionNumber - info.userNumber}</div>
               <div className="t3">题</div>
             </div>}
           </div>
@@ -967,10 +969,10 @@ export default class extends Page {
           <div className="title">基本情况</div>
           <div className="block-wrapper">
             <div className="block">
-              <PieChart option={pieOption1('正确率', detail.info.userCorrect, detail.info.userNumber, detail.info.totalCorrect, detail.info.totalNumber)} />
+              <PieChart option={pieOption1('正确率', info.userCorrect, info.userNumber, info.totalCorrect, info.totalNumber)} />
             </div>
             <div className="block">
-              <BarChart option={barOption1('用时', detail.info.userTime / detail.info.userNumber, detail.info.totalTime / detail.info.totalNumber, detail.info.correctTime, detail.info.incorrectTime)} />
+              <BarChart option={barOption1('用时', info.userTime / info.userNumber, info.totalTime / info.totalNumber, info.correctTime, info.incorrectTime)} />
             </div>
           </div>
         </div>
@@ -981,18 +983,18 @@ export default class extends Page {
           <div className="detail-1">
             <div className="block">
               <div className="t1">平均用时</div>
-              <div dangerouslySetInnerHTML={{ __html: formatSeconds(detail.info.userTime / detail.info.userNumber).replace(/([0-9]+)(m|min|h|hour|s)/g, '<div class="s">$1</div><div class="t3">$2</div>') }} />
+              <div dangerouslySetInnerHTML={{ __html: formatSeconds(info.userTime / info.userNumber).replace(/([0-9]+)(m|min|h|hour|s)/g, '<div class="s">$1</div><div class="t3">$2</div>') }} />
             </div>
             <div className="block all">
               <div className="t1">全站用户</div>
-              <div dangerouslySetInnerHTML={{ __html: formatSeconds(detail.info.totalTime / detail.info.totalNumber).replace(/([0-9]+)(m|min|h|hour|s)/g, '<div class="s">$1</div><div class="t3">$2</div>') }} />
+              <div dangerouslySetInnerHTML={{ __html: formatSeconds(info.totalTime / info.totalNumber).replace(/([0-9]+)(m|min|h|hour|s)/g, '<div class="s">$1</div><div class="t3">$2</div>') }} />
             </div>
           </div>
           <LineChart
             height={400}
             option={lineOption1(
               '每题用时情况',
-              detail.pace.map(row => {
+              pace.map(row => {
                 return [`${row.no}`, row.userTime, row.time];
               }),
               ['我的', '全站'],
@@ -1007,19 +1009,19 @@ export default class extends Page {
           <div className="detail-1">
             <div className="block">
               <div className="t1">正确率</div>
-              <div className="t2">{formatPercent(detail.info.userCorrect, detail.info.userNumber, false)}</div>
+              <div className="t2">{formatPercent(info.userCorrect, info.userNumber, false)}</div>
             </div>
             <div className="block all">
               <div className="t1">全站用户</div>
               <div className="t2">90</div>
-              <div className="t3">{formatPercent(detail.info.totalCorrect, detail.info.totalNumber, false)}</div>
+              <div className="t3">{formatPercent(info.totalCorrect, info.totalNumber, false)}</div>
             </div>
           </div>
           <BarChart
             height={400}
             option={BarOption2(
               '正确率',
-              detail.difficult.map(row => {
+              difficult.map(row => {
                 return [QuestionDifficultMap[row.key], formatPercent(row.userCorrect, row.userNumber), formatPercent(row.totalCorrect, row.totalNumber)];
               }),
               ['我的', '全站'],
@@ -1034,24 +1036,24 @@ export default class extends Page {
           <div className="detail-1">
             <div className="block">
               <div className="t1">平均用时</div>
-              <div dangerouslySetInnerHTML={{ __html: formatSeconds(detail.info.userTime / detail.info.userNumber).replace(/([0-9]+)(m|min|h|hour|s)/g, '<div class="s">$1</div><div class="t3">$2</div>') }} />
+              <div dangerouslySetInnerHTML={{ __html: formatSeconds(info.userTime / info.userNumber).replace(/([0-9]+)(m|min|h|hour|s)/g, '<div class="s">$1</div><div class="t3">$2</div>') }} />
             </div>
             <div className="block all">
               <div className="t1">正确率</div>
-              <div className="t2">{formatPercent(detail.info.userCorrect, detail.info.userNumber, false)}</div>
+              <div className="t2">{formatPercent(info.userCorrect, info.userNumber, false)}</div>
             </div>
           </div>
           <BarChart
             height={400}
             option={BarOption3(
               ['知识点', '正确率分析', '用时分析'],
-              detail.place.map(row => {
+              place.map(row => {
                 return row.key;
               }),
-              detail.place.map(row => {
+              place.map(row => {
                 return formatPercent(row.userCorrect, row.userNumber);
               }),
-              detail.place.map(row => {
+              place.map(row => {
                 return row.userTime / row.userNumber;
               }),
               ['#7AA7DC', '#BFD4EE'],
@@ -1063,12 +1065,12 @@ export default class extends Page {
       <div className="body gray">
         <div className="content">
           <div className="title">实战提醒</div>
-          {detail.info.userTime > detail.info.time && <div className="tip">
+          {info.userTime > info.time && <div className="tip">
             <div className="t1">在实战限时情况下,本套题正确率为 </div>
-            <div className="t2">{formatPercent(detail.limit.userCorrect, detail.limit.userNumber)}</div>
+            <div className="t2">{formatPercent(limit.userCorrect, limit.userNumber)}</div>
             <Tooltip message="仅统计在建议时间内完成题目正确率情况,更接近实战表现"><Icon type="question-circle" theme="filled" /></Tooltip>
           </div>}
-          {detail.info.userTime <= detail.info.time && <div className="tip">
+          {info.userTime <= info.time && <div className="tip">
             <div className="t1">目前的做题速度已达到实战标准!很棒!请继续保持!</div>
           </div>}
         </div>
@@ -1090,7 +1092,8 @@ export default class extends Page {
   renderExaminationDetail() {
     const { report = {}, tab } = this.state;
     const { detail = {} } = report;
-    const subjectDetail = tab === 'main' ? null : (detail.subject || {})[tab] || { info: {}, defficlt: [], place: [], pace: [] };
+    const { subject = {} } = detail;
+    const subjectDetail = tab === 'main' ? null : (subject || {})[tab] || { info: {}, defficlt: [], place: [], pace: [] };
     return <div>
       <div className="body">
         <div className="content">
@@ -1121,30 +1124,30 @@ export default class extends Page {
               <div className="block">
                 <div className="t1">总耗时</div>
                 <div className="t1">
-                  <div className="t2">{formatMinute((detail.subject.verbal || {}).userTime, true)}</div>
+                  <div className="t2">{formatMinute((subject.verbal || {}).userTime, true)}</div>
                   <div className="t3">min</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{formatMinute((detail.subject.quant || {}).userTime, true)}</div>
+                  <div className="t2">{formatMinute((subject.quant || {}).userTime, true)}</div>
                   <div className="t3">min</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{formatMinute((detail.subject.ir || {}).userTime, true)}</div>
+                  <div className="t2">{formatMinute((subject.ir || {}).userTime, true)}</div>
                   <div className="t3">min</div>
                 </div>
               </div>
               <div className="block">
                 <div className="t1">超出建议用时</div>
                 <div className="t1">
-                  <div className="t2">{formatMinute((detail.subject.verbal || {}).userTime - (detail.subject.verbal || {}).time, true)}</div>
+                  <div className="t2">{formatMinute((subject.verbal || {}).userTime - (subject.verbal || {}).time, true)}</div>
                   <div className="t3">min</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{formatMinute((detail.subject.quant || {}).userTime - (detail.subject.quant || {}).time, true)}</div>
+                  <div className="t2">{formatMinute((subject.quant || {}).userTime - (subject.quant || {}).time, true)}</div>
                   <div className="t3">min</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{formatMinute((detail.subject.ir || {}).userTime - (detail.subject.ir || {}).time, true)}</div>
+                  <div className="t2">{formatMinute((subject.ir || {}).userTime - (subject.ir || {}).time, true)}</div>
                   <div className="t3">min</div>
                 </div>
               </div>
@@ -1163,30 +1166,30 @@ export default class extends Page {
               <div className="block">
                 <div className="t1">完成题目</div>
                 <div className="t1">
-                  <div className="t2">{(detail.subject.verbal || {}).userNumber}</div>
+                  <div className="t2">{(subject.verbal || {}).userNumber}</div>
                   <div className="t3">题</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{(detail.subject.quant || {}).userNumber}</div>
+                  <div className="t2">{(subject.quant || {}).userNumber}</div>
                   <div className="t3">题</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{(detail.subject.ir || {}).userNumber}</div>
+                  <div className="t2">{(subject.ir || {}).userNumber}</div>
                   <div className="t3">题</div>
                 </div>
               </div>
               <div className="block">
                 <div className="t1">剩余未做</div>
                 <div className="t1">
-                  <div className="t2">{(detail.subject.verbal || {}).questionNumber - (detail.subject.verbal || {}).userNumber}</div>
+                  <div className="t2">{(subject.verbal || {}).questionNumber - (subject.verbal || {}).userNumber}</div>
                   <div className="t3">题</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{(detail.subject.quant || {}).questionNumber - (detail.subject.quant || {}).userNumber}</div>
+                  <div className="t2">{(subject.quant || {}).questionNumber - (subject.quant || {}).userNumber}</div>
                   <div className="t3">题</div>
                 </div>
                 <div className="t1">
-                  <div className="t2">{(detail.subject.ir || {}).questionNumber - (detail.subject.ir || {}).userNumber}</div>
+                  <div className="t2">{(subject.ir || {}).questionNumber - (subject.ir || {}).userNumber}</div>
                   <div className="t3">题</div>
                 </div>
               </div>

+ 3 - 3
front/project/www/stores/my.js

@@ -286,14 +286,14 @@ export default class MyStore extends BaseStore {
 
   /**
    * 添加题目提问
-   * @param {*} userPaperId : 用于获取预习作业,判断权限
+   * @param {*} userQuestionId : 用于获取预习作业,判断权限
    * @param {*} target
    * @param {*} questionModule
    * @param {*} questionNoId
    * @param {*} content
    */
-  addQuestionAsk(userPaperId, target, questionModule, questionNoId, originContent, content) {
-    return this.apiPost('/my/ask/question', { userPaperId, target, questionModule, questionNoId, originContent, content });
+  addQuestionAsk(userQuestionId, target, questionModule, questionNoId, originContent, content) {
+    return this.apiPost('/my/ask/question', { userQuestionId, target, questionModule, questionNoId, originContent, content });
   }
 
   /**

+ 1 - 1
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserAskQuestionRelationMapper.xml

@@ -11,7 +11,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    uaq.`id`
+    DISTINCT(uaq.`id`)
   </sql>
 
   <!--修改问答排序-->

+ 1 - 1
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserCollectQuestionRelationMapper.xml

@@ -11,7 +11,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    ucq.`id`
+    DISTINCT(ucq.`id`)
   </sql>
 
   <select id="listExercise" resultMap="IdMap">

+ 1 - 1
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserNoteQuestionRelationMapper.xml

@@ -11,7 +11,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    unq.`id`
+    DISTINCT(unq.`id`)
   </sql>
 
   <select id="listExercise" resultMap="IdMap">

+ 3 - 3
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml

@@ -33,7 +33,7 @@
       <bind name="keywordLike" value="'%' + keyword + '%'" />
     </if>
     select
-    up.`id`, ur.`user_correct` / up.`question_number` as `correct`, up.`user_time` / up.`question_number` as `time`
+    DISTINCT(up.`id`), ur.`user_correct` / up.`question_number` as `correct`, up.`user_time` / up.`question_number` as `time`
     from `user_paper` up
     left join `user_report` ur on ur.`id`= up.`latest_report_id`
     where up.`user_id` = #{userId,jdbcType=VARCHAR}
@@ -56,7 +56,7 @@
       <bind name="keywordLike" value="'%' + keyword + '%'" />
     </if>
     select
-    up.`id`,
+    DISTINCT(up.`id`),
     up.`title` as `title`,
     ur.`user_correct` / up.`question_number` as `correct`,
     up.`user_time` / up.`question_number` as `time`,
@@ -133,7 +133,7 @@
       <bind name="keywordLike" value="'%' + keyword + '%'" />
     </if>
     select
-    up.`id`, ur.`user_correct` / up.`question_number` as `correct`, up.`user_time` / up.`question_number` as `time`
+    DISTINCT(up.`id`), ur.`user_correct` / up.`question_number` as `correct`, up.`user_time` / up.`question_number` as `time`
     from `user_paper` up
     left join `user_report` ur on ur.`id`= up.`latest_report_id`
     left join `examination_paper` ep on up.`paper_origin` = 'examination' and ep.`id` = up.`origin_id`

+ 27 - 9
server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserController.java

@@ -42,6 +42,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.*;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
@@ -805,16 +806,15 @@ public class UserController {
 
     @RequestMapping(value = "/invoice/finish", method = RequestMethod.PUT)
     @ApiOperation(value = "开发票", httpMethod = "PUT")
-    public Response<Boolean> finishInvoice(
-            @RequestParam(required = false) Integer[] ids,
+    public Response<Boolean> finishInvoice(@RequestBody @Validated InvoiceFinishDto dto,
             HttpServletRequest request) {
-        userInvoiceService.finish(ids);
+        userInvoiceService.finish(dto.getIds());
         managerLogService.log(request);
         return ResponseHelp.success(true);
     }
 
-    @RequestMapping(value = "/invoice/download", method = RequestMethod.PUT)
-    @ApiOperation(value = "下载发票", httpMethod = "PUT")
+    @RequestMapping(value = "/invoice/download", method = RequestMethod.GET)
+    @ApiOperation(value = "下载发票", httpMethod = "GET")
     public Response<Boolean> downloadInvoice(
             @RequestParam(required = false) Integer[] ids,
             HttpServletRequest request, HttpServletResponse response) throws IOException {
@@ -826,7 +826,7 @@ public class UserController {
         Map userMap = Transform.getMap(userList, User.class, "id");
         Collection orderIds = Transform.getIds(list, UserInvoice.class, "orderId");
         List<UserOrder> orderList = userOrderService.select(orderIds);
-        Map orderMap = Transform.getMap(orderList, User.class, "id");
+        Map orderMap = Transform.getMap(orderList, UserOrder.class, "id");
 
         String columnNames[]={"申请时间","用户昵称","用户ID","用户手机号","开票今金额","开票内容", "发票抬头", "纳税人识别号", "收件邮箱"};//列名
         String filename = "发票";
@@ -843,13 +843,31 @@ public class UserController {
             cell.setCellValue(columnNames[i]);
         }
         int i = 0;
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         for(UserInvoice invoice : list){
             i+=1;
+            int j = -1;
+            Row r = sheet.createRow(i);
             User user = (User) userMap.get(invoice.getUserId());
             UserOrder userOrder = (UserOrder) orderMap.get(invoice.getOrderId());
-            Row r = sheet.createRow(i);
-            Cell cell = r.createCell(0);
-            cell.setCellValue(invoice.getId());
+            Cell time = r.createCell(++j);
+            time.setCellValue(sdf.format(invoice.getCreateTime()));
+            Cell nickname = r.createCell(++j);
+            nickname.setCellValue(user.getNickname());
+            Cell userId = r.createCell(++j);
+            userId.setCellValue(user.getId());
+            Cell mobile = r.createCell(++j);
+            mobile.setCellValue(user.getMobile());
+            Cell invoiceMoney = r.createCell(++j);
+            invoiceMoney.setCellValue(userOrder.getInvoiceMoney().toString());
+            Cell content = r.createCell(++j);
+            content.setCellValue("服务费:");
+            Cell title = r.createCell(++j);
+            title.setCellValue(invoice.getTitle());
+            Cell identity = r.createCell(++j);
+            identity.setCellValue(invoice.getIdentity());
+            Cell email = r.createCell(++j);
+            email.setCellValue(user.getEmail());
         }
         //同理可以设置数据行
         ByteArrayOutputStream os = new ByteArrayOutputStream();

+ 12 - 7
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -1285,8 +1285,7 @@ public class MyController {
         UserAskQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
         entity.setUserId(user.getId());
-        PaperModule paperModule = PaperModule.ValueOf(dto.getPaperModule());
-        QuestionModule questionModule = QuestionModule.WithPaper(paperModule);
+        QuestionModule questionModule = QuestionModule.ValueOf(dto.getQuestionModule());
         Question question;
         switch (questionModule){
             case BASE:
@@ -1317,14 +1316,20 @@ public class MyController {
                 throw new ParameterException("题目模块错误");
         }
 
-        entity.setAskModule(AskModule.WithPaper(paperModule).key);
         Integer assignId = null;
-        if (dto.getUserPaperId() != null && dto.getUserPaperId() > 0){
-            UserPaper userPaper = userPaperService.get(dto.getUserPaperId());
+        PaperModule paperModule = null;
+        if (dto.getUserQuestionId() != null && dto.getUserQuestionId() > 0){
+            UserQuestion userQuestion = userQuestionService.get(dto.getUserQuestionId());
+            UserReport userReport = userReportService.get(userQuestion.getReportId());
+            UserPaper userPaper = userPaperService.get(userReport.getPaperId());
             if(userPaper != null && userPaper.getPaperOrigin().equals(PaperOrigin.PREVIEW.key)){
                 assignId = userPaper.getOriginId();
             }
+            paperModule = PaperModule.ValueOf(userPaper.getPaperModule());
+        }else{
+            paperModule = PaperModule.WithQuestion(questionModule);
         }
+        entity.setAskModule(AskModule.WithPaper(paperModule).key);
         Integer recordId = questionFlowService.questionRelationCourse(user.getId(), assignId, QuestionType.ValueOf(question.getQuestionType()));
 
         if (recordId != null){
@@ -1400,9 +1405,9 @@ public class MyController {
         List<UserAskQuestionInfoDto> pr = Transform.convert(p, UserAskQuestionInfoDto.class);
 
         // 获取题目信息
-        Collection questionIds = Transform.getIds(pr, UserNoteQuestionInfoDto.class, "questionId");
+        Collection questionIds = Transform.getIds(pr, UserAskQuestionInfoDto.class, "questionId");
         List<Question> questionList = questionService.select(questionIds);
-        Transform.combine(pr, questionList, UserNoteQuestionInfoDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
+        Transform.combine(pr, questionList, UserAskQuestionInfoDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
 
         List<UserAskQuestionInfoDto> basePr = pr.stream().filter((row)->row.getQuestionModule().equals(QuestionModule.BASE.key)).collect(Collectors.toList());
         Collection baseQuestionNoIds = Transform.getIds(basePr, UserAskQuestionInfoDto.class, "questionNoId");

+ 13 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/InvoiceDownloadDto.java

@@ -0,0 +1,13 @@
+package com.qxgmat.dto.admin.request;
+
+public class InvoiceDownloadDto {
+    private Integer[] ids;
+
+    public Integer[] getIds() {
+        return ids;
+    }
+
+    public void setIds(Integer[] ids) {
+        this.ids = ids;
+    }
+}

+ 13 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/InvoiceFinishDto.java

@@ -0,0 +1,13 @@
+package com.qxgmat.dto.admin.request;
+
+public class InvoiceFinishDto {
+    private Integer[] ids;
+
+    public Integer[] getIds() {
+        return ids;
+    }
+
+    public void setIds(Integer[] ids) {
+        this.ids = ids;
+    }
+}

+ 25 - 1
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserInvoiceListDto.java

@@ -6,10 +6,34 @@ import com.qxgmat.dto.admin.extend.UserExtendDto;
 import com.qxgmat.dto.admin.extend.UserOrderExtendDto;
 
 @Dto(entity = UserInvoice.class)
-public class UserInvoiceListDto {
+public class UserInvoiceListDto extends UserInvoice {
     private Integer id;
 
     private UserOrderExtendDto order;
 
     private UserExtendDto user;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public UserOrderExtendDto getOrder() {
+        return order;
+    }
+
+    public void setOrder(UserOrderExtendDto order) {
+        this.order = order;
+    }
+
+    public UserExtendDto getUser() {
+        return user;
+    }
+
+    public void setUser(UserExtendDto user) {
+        this.user = user;
+    }
 }

+ 9 - 9
server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionExtendDto.java

@@ -10,7 +10,7 @@ public class QuestionExtendDto {
 
     private String description;
 
-    private String type;
+    private String questionType;
 
     private String difficult;
 
@@ -26,14 +26,6 @@ public class QuestionExtendDto {
         this.id = id;
     }
 
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
     public String getDifficult() {
         return difficult;
     }
@@ -65,4 +57,12 @@ public class QuestionExtendDto {
     public void setCollectionNumber(Integer collectionNumber) {
         this.collectionNumber = collectionNumber;
     }
+
+    public String getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
+    }
 }

+ 20 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperBaseExtendDto.java

@@ -19,6 +19,10 @@ public class UserPaperBaseExtendDto {
 
     private Integer questionNumber;
 
+    private String paperModule;
+
+    private String paperOrigin;
+
     private Date latestTime;
 
     private UserReportExtendDto report;
@@ -78,4 +82,20 @@ public class UserPaperBaseExtendDto {
     public void setReport(UserReportExtendDto report) {
         this.report = report;
     }
+
+    public String getPaperModule() {
+        return paperModule;
+    }
+
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
+    }
+
+    public String getPaperOrigin() {
+        return paperOrigin;
+    }
+
+    public void setPaperOrigin(String paperOrigin) {
+        this.paperOrigin = paperOrigin;
+    }
 }

+ 20 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperDetailExtendDto.java

@@ -14,6 +14,10 @@ public class UserPaperDetailExtendDto {
 
     private String title;
 
+    private String paperModule;
+
+    private String paperOrigin;
+
     private Date latestTime;
 
     private UserReportExtendDto report;
@@ -57,4 +61,20 @@ public class UserPaperDetailExtendDto {
     public void setLatestTime(Date latestTime) {
         this.latestTime = latestTime;
     }
+
+    public String getPaperModule() {
+        return paperModule;
+    }
+
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
+    }
+
+    public String getPaperOrigin() {
+        return paperOrigin;
+    }
+
+    public void setPaperOrigin(String paperOrigin) {
+        this.paperOrigin = paperOrigin;
+    }
 }

+ 20 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserReportExtendDto.java

@@ -14,6 +14,10 @@ public class UserReportExtendDto {
 
     private Integer time;
 
+    private String paperModule;
+
+    private String paperOrigin;
+
     private Integer questionNumber;
 
     private Integer userNumber;
@@ -119,4 +123,20 @@ public class UserReportExtendDto {
     public void setSetting(JSONObject setting) {
         this.setting = setting;
     }
+
+    public String getPaperModule() {
+        return paperModule;
+    }
+
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
+    }
+
+    public String getPaperOrigin() {
+        return paperOrigin;
+    }
+
+    public void setPaperOrigin(String paperOrigin) {
+        this.paperOrigin = paperOrigin;
+    }
 }

+ 10 - 10
server/gateway-api/src/main/java/com/qxgmat/dto/request/UserAskQuestionDto.java

@@ -6,11 +6,11 @@ import com.qxgmat.data.dao.entity.UserNoteQuestion;
 
 @Dto(entity = UserAskQuestion.class)
 public class UserAskQuestionDto {
-    private Integer userPaperId;
+    private Integer userQuestionId;
 
     private String target;
 
-    private String paperModule;
+    private String questionModule;
 
     private Integer questionNoId;
 
@@ -50,19 +50,19 @@ public class UserAskQuestionDto {
         this.originContent = originContent;
     }
 
-    public String getPaperModule() {
-        return paperModule;
+    public Integer getUserQuestionId() {
+        return userQuestionId;
     }
 
-    public void setPaperModule(String paperModule) {
-        this.paperModule = paperModule;
+    public void setUserQuestionId(Integer userQuestionId) {
+        this.userQuestionId = userQuestionId;
     }
 
-    public Integer getUserPaperId() {
-        return userPaperId;
+    public String getQuestionModule() {
+        return questionModule;
     }
 
-    public void setUserPaperId(Integer userPaperId) {
-        this.userPaperId = userPaperId;
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
     }
 }

+ 3 - 1
server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java

@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
@@ -115,11 +116,12 @@ public class UserCollectQuestionService extends AbstractService {
      * @return
      */
     public List<UserCollectQuestion> listByUserAndQuestions(Integer userId, Collection ids){
+        if (ids == null || ids.size() == 0) return new ArrayList<>();
         Example example = new Example(UserCollectQuestion.class);
         example.and(
                 example.createCriteria()
                         .andEqualTo("userId", userId)
-                        .andEqualTo("questionId", ids)
+                        .andIn("questionId", ids)
         );
         return select(userCollectQuestionMapper, example);
     }

+ 3 - 4
server/gateway-api/src/main/java/com/qxgmat/service/UserNoteQuestionService.java

@@ -25,6 +25,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
@@ -49,7 +50,6 @@ public class UserNoteQuestionService extends AbstractService {
      * @param startTime
      * @param endTime
      * @param order
-     * @param direction
      * @return
      */
     public Page<UserNoteQuestion> listExercise(int page, int size, Integer userId, String keyword, String[] questionTypes, Integer[] structIds, String startTime, String endTime, String order){
@@ -74,7 +74,6 @@ public class UserNoteQuestionService extends AbstractService {
      * @param startTime
      * @param endTime
      * @param order
-     * @param direction
      * @return
      */
     public Page<UserNoteQuestion> listExamination(int page, int size, Integer userId, String keyword, String[] questionTypes, Integer[] structIds, Integer libraryId, String year, String startTime, String endTime, String order){
@@ -115,11 +114,12 @@ public class UserNoteQuestionService extends AbstractService {
      * @return
      */
     public List<UserNoteQuestion> listByUserAndQuestions(Integer userId, Collection ids){
+        if(ids==null || ids.size() == 0) return new ArrayList<>();
         Example example = new Example(UserNoteQuestion.class);
         example.and(
                 example.createCriteria()
                         .andEqualTo("userId", userId)
-                        .andEqualTo("questionId", ids)
+                        .andIn("questionId", ids)
         );
         return select(userNoteQuestionMapper, example);
     }
@@ -131,7 +131,6 @@ public class UserNoteQuestionService extends AbstractService {
      */
     @Transactional
     public UserNoteQuestion update(UserNoteQuestion note){
-
         Example example = new Example(UserNoteQuestion.class);
         example.and(
                 example.createCriteria()

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java

@@ -974,7 +974,7 @@ public class QuestionFlowService {
      * @param userId
      * @return
      */
-    public List<UserQuestion> listByReport(Integer userReportId, Integer userId){
+    public List<UserQuestion> listByReport(Integer userId,Integer userReportId){
         List<UserQuestion> userQuestionList = userQuestionService.listByReport(userId, userReportId);
         return userQuestionList;
     }

+ 2 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserInvoiceService.java

@@ -93,6 +93,7 @@ public class UserInvoiceService extends AbstractService {
     }
 
     public void finish(Integer[] ids){
+        if (ids == null || ids.length == 0) return;
         Example example = new Example(UserInvoice.class);
         example.and(
                 example.createCriteria().andIn("id", Arrays.stream(ids).collect(Collectors.toList()))
@@ -101,6 +102,7 @@ public class UserInvoiceService extends AbstractService {
     }
 
     public void download(Integer[] ids){
+        if (ids == null || ids.length == 0) return;
         Example example = new Example(UserInvoice.class);
         example.and(
                 example.createCriteria().andIn("id", Arrays.stream(ids).collect(Collectors.toList()))