djTask.vue 11 KB

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