djTask.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. <template>
  2. <view class="djTask">
  3. <!-- 任务进度 -->
  4. <view class="progress_title">
  5. <view class="progress">
  6. <text class="progress_text">任务进度:<text class="progress_text_1">{{wwcNumber()}}/{{pageData.totalProgress}}</text></text>
  7. </view>
  8. <view class="bhgs">
  9. <text class="bhgs_title">不合格数<text class="bhgs_text">{{bhgNumber()}}</text></text>
  10. </view>
  11. </view>
  12. <!-- 处方编号 -->
  13. <view class="sub_title">
  14. <view class="cfbh">
  15. <text class="cfbh_title">处方编号<text class="cfbh_text">{{pageData.cfbh}}</text></text>
  16. </view>
  17. </view>
  18. <!-- 操作人 -->
  19. <view class="operator" v-if="pageData.operatorName!=null && pageData.operatorName!=''">
  20. <text class="operator_title">操作人<text class="operator_text">{{pageData.operatorName}}</text></text>
  21. </view>
  22. <!-- 检查结果 -->
  23. <uni-card padding="0" spacing="0" v-for="(item,index) in pageData.resData.results" class="djList">
  24. <view class="djList_title">
  25. <view class="djList_text">检查项目</view>
  26. <view class="djList_righttext">{{item.item}}</view>
  27. </view>
  28. <view class="djList_title">
  29. <view class="djList_text">检查内容</view>
  30. <view class="djList_righttext">{{item.assessmentCriteria}}</view>
  31. </view>
  32. <view class="djList_title">
  33. <view class="djList_text">检查结果</view>
  34. <view :class="item.assessmentResult=='不合格'? 'djList_redtext' : 'djList_righttext'">{{item.assessmentResult}}</view>
  35. </view>
  36. <view class="djList_title" v-if="item.resultContent">
  37. <view class="djList_text">原因</view>
  38. <view class="djList_righttext">{{item.resultContent}}</view>
  39. </view>
  40. <view class="button_group" v-if="pageData.operatorStatus=='add' || pageData.taskStatus=='1'">
  41. <view class="bhg_button" @click="bhgCheck(item)">不合格</view>
  42. <view class="hg_button" @click="hgCheck(item)">合格</view>
  43. </view>
  44. </uni-card>
  45. <!-- 图片上传 -->
  46. <view class="image_upload">
  47. <uni-card>
  48. <uni-section title="图片上传" type="line"></uni-section>
  49. <view class="img_upload">
  50. <uni-file-picker limit="4" :modelValue="showImage(pageData.imageList)" :readonly="pageData.imageStatus" @select="selectImg" @delete="deleteImg"></uni-file-picker>
  51. </view>
  52. </uni-card>
  53. </view>
  54. <!-- 按钮 -->
  55. <view class="operator_button" v-if="pageData.operatorStatus=='add'">
  56. <button :class="pageData.buttonDisabled==false?'pass_button':'pass_button_grey'" @click="pass" :disabled="pageData.buttonDisabled">一键通过</button>
  57. <!-- 如果还有数据按钮显示为“下一个”,数据全部加载完毕显示为“完成” -->
  58. <view class="finish_button_grop">
  59. <button class="next_or_finish_button" @click="next">下一个</button>
  60. </view>
  61. </view>
  62. <!-- 任务详情-编辑 -->
  63. <view class="operator_button" v-if="pageData.taskStatus=='2' && pageData.taskStatusData!='7004'">
  64. <button class="pass_button" @click="back">返回</button>
  65. <view class="finish_button_grop">
  66. <button class="next_or_finish_button" @click="editTask()">编辑</button>
  67. </view>
  68. </view>
  69. <!-- 任务详情-保存 -->
  70. <view class="finish_button" v-if="pageData.taskStatus=='1'">
  71. <button class="button" @click="next">保存</button>
  72. </view>
  73. <!-- 不合格弹出框 -->
  74. <uni-popup ref="bhgDialog" type="dialog">
  75. <uni-popup-dialog type="info" mode="input" confirmText="确定" cancelText="取消" title="不合格原因" value="" placeholder="请填写不合格原因" @confirm="bhgDialogConfirm"
  76. @close="bhgDialogClose">
  77. <uni-easyinput type="textarea" maxlength="50" autoHeight v-model="pageData.reason" placeholder="请输入不合格原因"></uni-easyinput>
  78. </uni-popup-dialog>
  79. </uni-popup>
  80. <!-- 一键通过弹出框 -->
  81. <uni-popup ref="passDialog" type="dialog">
  82. <view class="passDialog">
  83. <view class="passDialog_title">
  84. <uni-title type="h2" title="一键通过" align="center"></uni-title>
  85. <!-- 倒计时 -->
  86. <smh-countDown second="10" radius="60" lineWidth="3rpx" color="#BFA578" @end="countDownEnd"></smh-countDown>
  87. </view>
  88. <view class="passDialog_content">
  89. <view>10秒后将自动跳转下一个处方</view>
  90. <view class="passDialog_content_cancel">点击取消可停留本页面</view>
  91. </view>
  92. <view class="passDialog_button">
  93. <view class="passDialog_button_cancel" @click="passCancel">取消</view>
  94. <view class="passDialog_button_confirm" @click="passConfirm">确定</view>
  95. </view>
  96. </view>
  97. </uni-popup>
  98. </view>
  99. </template>
  100. <script setup>
  101. import { ref,reactive, computed } from "vue";
  102. import {onLoad,onShow,onUnload,onPullDownRefresh} from "@dcloudio/uni-app";
  103. import http from '@/utils/request';
  104. import {uploadImageModelValue} from '@/pages/controls/image/OssService'
  105. const pageData=reactive({
  106. // 处方编号
  107. cfbh:'',
  108. // 操作人姓名
  109. operatorName:'',
  110. // 操作状态,是编辑/查看
  111. operatorStatus:'',
  112. djList:[],
  113. // 检查项目Id
  114. checkId:'',
  115. // 合格列表
  116. hgList:[],
  117. // 不合格列表
  118. bhgList:[],
  119. // 不合格原因
  120. reason:'',
  121. resData:[],
  122. imageIdList:[],
  123. // 图片列表
  124. imageList:[],
  125. imageStatus:true,
  126. id:'',
  127. totalProgress:0,
  128. // 任务状态(编辑为2,保存为1)
  129. taskStatus:'',
  130. taskStatusData:'',
  131. buttonDisabled:true
  132. })
  133. const formData=reactive({
  134. id:'',
  135. pageSize:1,
  136. pageNum:10
  137. })
  138. const createData=reactive({
  139. taskId:'',
  140. pId:'',
  141. providerType:''
  142. })
  143. const saveTaskData=reactive({
  144. detail:'',
  145. unHgStateName:''
  146. })
  147. // 不合格数
  148. const bhgNumber=()=>{
  149. let number=0
  150. if(pageData.resData.results!=null){
  151. pageData.resData.results.forEach(item=>{
  152. if(item.assessmentResult=='不合格'){
  153. number++
  154. }
  155. })
  156. }
  157. return number
  158. }
  159. // 定义不合格弹出输入框
  160. const bhgDialog=ref()
  161. // 提交不合格原因
  162. const bhgDialogConfirm=()=>{
  163. // 获取输入的不合格原因
  164. item.value.resultContent = pageData.reason
  165. pageData.resData.results.forEach((e,idx)=>{
  166. if(e.id==item.value.id){
  167. pageData.resData.results[idx]=item.value
  168. }
  169. })
  170. pageData.reason=''
  171. bhgDialog._value.close()
  172. item.value = {}
  173. }
  174. // 任务进度(已完成)
  175. const wwcNumber = () =>{
  176. let number = 0
  177. let data = pageData.resData.results
  178. if(data != null){
  179. for (var i = 0; i < data.length; i++) {
  180. if (data[i].assessmentResult != null && data[i].assessmentResult != undefined && data[i].assessmentResult != '待检')
  181. number ++;
  182. }
  183. }
  184. return number
  185. }
  186. // 取消不合格弹出输入框
  187. const bhgDialogClose=()=>{
  188. // 关闭不合格弹出框
  189. pageData.reason=''
  190. bhgDialog._value.close()
  191. }
  192. // 一键通过弹出框
  193. const passDialog=ref()
  194. // 一键通过弹出框确定事件
  195. const passConfirm=()=>{
  196. countTotal()
  197. saveDjTask()
  198. }
  199. // 一键通过弹出框取消事件
  200. const passCancel=()=>{
  201. passDialog._value.close()
  202. }
  203. // 一键通过弹出框倒计时接收事件
  204. const countDownEnd=()=>{
  205. countTotal()
  206. saveDjTask()
  207. }
  208. // 选中图片,将选中的图片添加列表
  209. const selectImg=(e)=>{
  210. if(pageData.imageList==null || pageData.imageList == undefined){
  211. pageData.imageList=[]
  212. }
  213. e.tempFiles.forEach(item=>{
  214. uni.showLoading({
  215. title: '图片上传....',
  216. mask: true
  217. });
  218. http.upload("oss/upload",{file:item.file}).then(e => {
  219. uni.hideLoading()
  220. pageData.imageList.push(e.id)
  221. })
  222. })
  223. }
  224. // 删除图片,并将其从列表中删除
  225. const deleteImg=(e)=>{
  226. let index=0
  227. pageData.imageList.forEach((item,idx)=>{
  228. index=e.tempFilePath.indexOf(item)
  229. if(index>0){
  230. // 删除列表中的元素
  231. pageData.imageList.splice(idx,1)
  232. }
  233. })
  234. }
  235. const item = ref({})
  236. // 不合格
  237. const bhgCheck=(e)=>{
  238. e.score=0
  239. if(e.assessmentResult=="合格" || e.assessmentResult=="待检"){
  240. e.assessmentResult="不合格"
  241. item.value = e
  242. // 打开不合格弹出输入框
  243. bhgDialog._value.open()
  244. }
  245. }
  246. // 合格
  247. const hgCheck=(e)=>{
  248. pageData.hgList.push(e.id)
  249. if(e.assessmentResult=='不合格' || e.assessmentResult=='待检'){
  250. e.assessmentResult='合格'
  251. e.score=e.totalScore
  252. e.resultContent=''
  253. }
  254. }
  255. // 一键通过
  256. const pass=()=>{
  257. pageData.resData.results.forEach(item=>{
  258. item.assessmentResult='合格'
  259. item.resultContent=''
  260. })
  261. passDialog._value.open()
  262. }
  263. // 计算代煎总分
  264. const countTotal=()=>{
  265. pageData.resData.resultContent=0
  266. pageData.resData.results.forEach(item=>{
  267. pageData.resData.resultContent+=Number(item.score)
  268. })
  269. if(pageData.imageList!=null || pageData.imageList!=undefined){
  270. pageData.resData.detail.imageIds=pageData.imageList.toString()
  271. }
  272. }
  273. const saveDjTask=()=>{
  274. uni.showLoading({
  275. title: '提交中....',
  276. mask: true
  277. });
  278. http.post("app-api/zkzy/save",pageData.resData).then(res=>{
  279. uni.hideLoading()
  280. if(res==true){
  281. uni.showToast({
  282. title: '提交成功',
  283. success: () => {
  284. uni.navigateBack({
  285. delta:1
  286. })
  287. }
  288. });
  289. }else{
  290. uni.showToast({
  291. title: '提交失败'
  292. });
  293. }
  294. })
  295. }
  296. // 下一个
  297. const next=()=>{
  298. if(wwcNumber()==pageData.totalProgress){
  299. countTotal()
  300. saveDjTask()
  301. }else{
  302. uni.showToast({
  303. title: '提交失败,请检查任务进度',
  304. icon:'error'
  305. });
  306. }
  307. }
  308. // 完成
  309. const finish=()=>{
  310. countTotal()
  311. saveDjTask()
  312. }
  313. // 返回
  314. const back=()=>{
  315. uni.navigateBack({
  316. delta: 1
  317. });
  318. }
  319. // 编辑
  320. const editTask=()=>{
  321. pageData.imageStatus=!pageData.imageStatus
  322. pageData.taskStatus='1'
  323. }
  324. // 临时创建代煎代配企业评估任务内容
  325. const createTask=()=>{
  326. getTaskId()
  327. http.get("app-api/zkzy/create",createData).then(res=>{
  328. if(res=="该处方已质控、不能重复添加"){
  329. uni.showToast({
  330. title: '该处方已质控、不能重复添加',
  331. icon:'none',
  332. success: () => {
  333. uni.navigateBack({
  334. delta: 1
  335. });
  336. }
  337. });
  338. }else{
  339. getDjTask(res)
  340. }
  341. })
  342. }
  343. // 获取代煎质控作业
  344. const getDjTask=(data)=>{
  345. formData.id=data
  346. http.get("app-api/taskDetail/get",formData).then(res=>{
  347. pageData.djList = res.results
  348. pageData.cfbh=res.detail.ptwybm
  349. saveTaskData.detail=res.results
  350. pageData.resData=res
  351. pageData.djList.forEach(item=>{
  352. // 一开始均为“待检状态”
  353. item.assessmentResult='待检'
  354. })
  355. pageData.totalProgress=res.results.length
  356. if(res.detail.imageIds!=null){
  357. pageData.imageList=showImage(res.detail.imageIds)
  358. }
  359. })
  360. }
  361. // 显示图片
  362. const showImage=(id)=>{
  363. return uploadImageModelValue(id)
  364. }
  365. // 获取taskId
  366. const getTaskId=()=>{
  367. uni.getStorage({
  368. key:'saveTaskId',
  369. success: (res) => {
  370. createData.taskId = res.data.taskId
  371. }
  372. })
  373. }
  374. const getDjTaskDetail=()=>{
  375. // getTaskId()
  376. http.get("app-api/taskDetail/get",{id:pageData.id}).then(res=>{
  377. pageData.resData=res
  378. pageData.totalProgress=res.results.length
  379. pageData.taskStatus=res.detail.status
  380. pageData.operatorName=res.detail.creatorName
  381. res.results.forEach(item=>{
  382. // 检查内容(分数与总分相同为合格,反之不合格)
  383. if(item.score==item.totalScore){
  384. item.assessmentResult='合格'
  385. }else{
  386. item.assessmentResult='不合格'
  387. pageData.bhgNum=pageData.bhgNum+1
  388. }
  389. })
  390. if(res.detail.imageIds!=null && res.detail.imageIds!=''){
  391. if(typeof(res.detail.imageIds)=='string'){
  392. var urls=res.detail.imageIds.split(',')
  393. pageData.imageList=[]
  394. urls.forEach(e=>{
  395. pageData.imageList.push(e)
  396. })
  397. }
  398. }
  399. })
  400. }
  401. onShow(()=>{
  402. setTimeout(()=>{
  403. pageData.buttonDisabled=false
  404. },5000)
  405. })
  406. onLoad((type)=>{
  407. if(type.state!=null){
  408. pageData.operatorStatus=type.state
  409. }
  410. if(type.cfbh!=null){
  411. pageData.cfbh=type.cfbh
  412. }
  413. if(type.ptwybh!=null){
  414. createData.pId=type.ptwybh
  415. }
  416. if(type.fyfslx!=null){
  417. createData.providerType=type.fyfslx
  418. }
  419. if(type.id!=null){
  420. pageData.id=type.id
  421. }
  422. if(type.taskStatus!=null){
  423. pageData.taskStatusData=type.taskStatus
  424. }
  425. // 获取代煎数据
  426. if(pageData.operatorStatus=='add'){
  427. pageData.imageStatus=false
  428. createTask()
  429. }else{
  430. pageData.imageStatus=true
  431. getDjTaskDetail()
  432. }
  433. })
  434. </script>
  435. <style lang="scss" scoped>
  436. @import './index.scss'
  437. </style>