detail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <template>
  2. <view >
  3. <tn-nav-bar fixed>详情</tn-nav-bar>
  4. <view class="" :style="{paddingTop: vuex_custom_bar_height + 'px'}">
  5. <tn-list-cell>
  6. <view class="list-icon-text">
  7. <view class="list__left">
  8. <view class="list__left__text tn-color-gray--dark">产品名称</view>
  9. </view>
  10. <view class="list__right">{{details.productName}}</view>
  11. </view>
  12. </tn-list-cell>
  13. <tn-list-cell>
  14. <view class="list-icon-text">
  15. <view class="list__left">
  16. <view class="list__left__text tn-color-gray--dark">产品型号</view>
  17. </view>
  18. <view class="list__right">{{details.productModel}}</view>
  19. </view>
  20. </tn-list-cell>
  21. <tn-list-cell>
  22. <view class="list-icon-text">
  23. <view class="list__left">
  24. <view class="list__left__text tn-color-gray--dark">产品二维码</view>
  25. </view>
  26. <view class="list__right">{{details.qrCode}}</view>
  27. </view>
  28. </tn-list-cell>
  29. <tn-list-cell>
  30. <view class="list-icon-text">
  31. <view class="list__left">
  32. <view class="list__left__text tn-color-gray--dark">报修图片</view>
  33. </view>
  34. <view class="list__right">
  35. <view
  36. v-for="(item, index) in details.repairsList"
  37. :key="index"
  38. class="tn-image-upload__item tn-image-upload__item-preview"
  39. :style="{
  40. width: $tn.string.getLengthUnitValue(170),
  41. height: $tn.string.getLengthUnitValue(170)
  42. }"
  43. >
  44. <image
  45. class="tn-image-upload__item-preview__image"
  46. :src="item"
  47. :mode="imageMode"
  48. @tap.stop="doPreviewImage(item, details.repairsList)"
  49. ></image>
  50. </view>
  51. </view>
  52. </view>
  53. </tn-list-cell>
  54. <tn-list-cell>
  55. <view class="list-icon-text">
  56. <view class="list__left">
  57. <view class="list__left__text tn-color-gray--dark">问题描述</view>
  58. </view>
  59. <view class="list__right">{{details.problemDesc}}</view>
  60. </view>
  61. </tn-list-cell>
  62. <tn-list-cell>
  63. <view class="list-icon-text">
  64. <view class="list__left">
  65. <view class="list__left__text tn-color-gray--dark">上报人</view>
  66. </view>
  67. <view class="list__right">{{details.createPersonName}}</view>
  68. </view>
  69. </tn-list-cell>
  70. <tn-list-cell>
  71. <view class="list-icon-text">
  72. <view class="list__left">
  73. <view class="list__left__text tn-color-gray--dark">上报时间</view>
  74. </view>
  75. <view class="list__right">{{details.createTime}}</view>
  76. </view>
  77. </tn-list-cell>
  78. <template v-if="details.status!=0 && details.status!=1">
  79. <tn-list-cell>
  80. <view class="list-icon-text">
  81. <view class="list__left">
  82. <view class="list__left__text tn-color-gray--dark">是否作废</view>
  83. </view>
  84. <view class="list__right">{{details.isInvalid==0?'否':'是'}}</view>
  85. </view>
  86. </tn-list-cell>
  87. <tn-list-cell v-if="details.isInvalid==1">
  88. <view class="list-icon-text">
  89. <view class="list__left">
  90. <view class="list__left__text tn-color-gray--dark">作废原因</view>
  91. </view>
  92. <view class="list__right">{{details.invalidCause}}</view>
  93. </view>
  94. </tn-list-cell>
  95. <tn-list-cell v-else>
  96. <view class="list-icon-text">
  97. <view class="list__left">
  98. <view class="list__left__text tn-color-gray--dark">维修图片</view>
  99. </view>
  100. <view class="list__right">
  101. <view
  102. v-for="(item, index) in details.reworkList"
  103. :key="index"
  104. class="tn-image-upload__item tn-image-upload__item-preview"
  105. :style="{
  106. width: $tn.string.getLengthUnitValue(170),
  107. height: $tn.string.getLengthUnitValue(170)
  108. }"
  109. >
  110. <image
  111. class="tn-image-upload__item-preview__image"
  112. :src="item"
  113. :mode="imageMode"
  114. @tap.stop="doPreviewImage(item, details.reworkList)"
  115. ></image>
  116. </view>
  117. </view>
  118. </view>
  119. </tn-list-cell>
  120. <tn-list-cell>
  121. <view class="list-icon-text">
  122. <view class="list__left">
  123. <view class="list__left__text tn-color-gray--dark">维修人</view>
  124. </view>
  125. <view class="list__right">{{details.reworkPersonName}}</view>
  126. </view>
  127. </tn-list-cell>
  128. <tn-list-cell>
  129. <view class="list-icon-text">
  130. <view class="list__left">
  131. <view class="list__left__text tn-color-gray--dark">维修时间</view>
  132. </view>
  133. <view class="list__right">{{details.reworkDate}}</view>
  134. </view>
  135. </tn-list-cell>
  136. </template>
  137. <template v-if="details.status!=1 && details.status!=2">
  138. <tn-list-cell>
  139. <view class="list-icon-text">
  140. <view class="list__left">
  141. <view class="list__left__text tn-color-gray--dark">审核人</view>
  142. </view>
  143. <view class="list__right">{{details.auditPersonName}}</view>
  144. </view>
  145. </tn-list-cell>
  146. <tn-list-cell>
  147. <view class="list-icon-text">
  148. <view class="list__left">
  149. <view class="list__left__text tn-color-gray--dark">审核时间</view>
  150. </view>
  151. <view class="list__right">{{details.auditDate}}</view>
  152. </view>
  153. </tn-list-cell>
  154. <tn-list-cell v-if="details.auditFailCause">
  155. <view class="list-icon-text">
  156. <view class="list__left">
  157. <view class="list__left__text tn-color-gray--dark">不通过原因</view>
  158. </view>
  159. <view class="list__right">{{details.auditFailCause}}</view>
  160. </view>
  161. </tn-list-cell>
  162. </template>
  163. <view class="tn-margin">
  164. <tn-button :shadow="true" width="100%" backgroundColor="#01BEFF" fontColor="#FFFFFF" @click="showInfoForm" v-if="details.status<2 && (permission==1 || permission==4)">维修</tn-button>
  165. </view>
  166. <view class="tn-margin">
  167. <tn-button :shadow="true" width="100%" backgroundColor="#01BEFF" fontColor="#FFFFFF" @click="showInfoForm" v-if="details.status==2 && (permission==1 || permission==3)">审核</tn-button>
  168. </view>
  169. </view>
  170. <!-- popup -->
  171. <tn-popup
  172. v-model="showForm"
  173. :marginTop="vuex_custom_bar_height"
  174. length="50%"
  175. mode="bottom"
  176. height="40%"
  177. :closeBtn="false"
  178. :maskCloseable="false"
  179. @close="closedPopup"
  180. >
  181. <view class="popup-content tn-margin" :class="{'popup-content--center': mode === 'center'}">
  182. <tn-form :model="form" ref="form" :labelPosition="labelPosition" :labelWidth="labelWidth" :labelAlign="labelAlign">
  183. <template v-if="details.status<2">
  184. <tn-form-item label="是否作废" prop="isInvalid" :width="radioWidth" :wrap="radioWrap" :required="true">
  185. <tn-radio-group v-model="form.isInvalid" >
  186. <tn-radio name="0">否</tn-radio>
  187. <tn-radio name="1">是</tn-radio>
  188. </tn-radio-group>
  189. </tn-form-item>
  190. <tn-form-item label="作废原因" prop="invalidCause" :required="true" v-if="form.isInvalid==1">
  191. <tn-input v-model="form.invalidCause" type="textarea" placeholder="请输入作废原因" ></tn-input>
  192. </tn-form-item>
  193. <tn-form-item label="维修图片" prop="images" :required="true" v-if="form.isInvalid==0">
  194. <tn-image-upload :fileList="form.images" :action="action" :header="header" @on-success="imageUploadChange"></tn-image-upload>
  195. </tn-form-item>
  196. <tn-form-item label="新二维码" prop="qrCode" v-if="form.isInvalid==0">
  197. <tn-input v-model="form.qrCode" type="text" placeholder="请输入二维码编码(新)" ></tn-input>
  198. <view slot="right" class="tn-icon-scan tn-color-blue" @click="openScan">扫码</view>
  199. </tn-form-item>
  200. </template>
  201. <template v-if="details.status==2">
  202. <tn-form-item label="维修结果" prop="checkResult" :width="radioWidth" :wrap="radioWrap" :required="true">
  203. <tn-radio-group v-model="form.checkResult" >
  204. <tn-radio name="1">通过</tn-radio>
  205. <tn-radio name="0">不通过</tn-radio>
  206. </tn-radio-group>
  207. </tn-form-item>
  208. <tn-form-item label="不通过原因" prop="problemDesc" :required="true" v-if="form.checkResult=='0'">
  209. <tn-input v-model="form.auditFailCause" type="textarea" placeholder="请输入不通过原因" ></tn-input>
  210. </tn-form-item>
  211. </template>
  212. </tn-form>
  213. <view class="tn-flex tn-flex-wrap tn-margin-top">
  214. <view class="tn-flex-basic-md tn-padding-right-xs">
  215. <tn-button :shadow="true" width="100%" backgroundColor="tn-bg-teal" fontColor="#FFFFFF" @click="closedPopup">关闭</tn-button>
  216. </view>
  217. <view class="tn-flex-basic-md tn-padding-left-xs">
  218. <tn-button :shadow="true" width="100%" backgroundColor="#01BEFF" fontColor="#FFFFFF" @click="submit">提交</tn-button>
  219. </view>
  220. </view>
  221. </view>
  222. </tn-popup>
  223. </view>
  224. </template>
  225. <script setup>
  226. export default {
  227. data(){
  228. return {
  229. permission: this.api.getUserPermission(),
  230. details:{},
  231. showForm:false,
  232. labelPosition: 'left',
  233. labelAlign: 'left',
  234. labelWidth: 150,
  235. action: this.api.apiHost()+"wx/communal/api/upload",
  236. header:{
  237. 'Authorization':'Basic d3hBcHBsZXQ6d3hBcHBsZXRfc2VjcmV0',
  238. 'tenant_id':'000000',
  239. 'Blade-Auth': "bearer "+this.api.getToken(),
  240. },
  241. form:{
  242. images:[],
  243. checkResult:'',
  244. auditFailCause:'',
  245. qrCode:'',
  246. isInvalid:'0',
  247. },
  248. rules: {
  249. images: [
  250. {
  251. required: true,
  252. message: '请选择图片',
  253. trigger: 'change',
  254. type: 'array'
  255. }
  256. ],
  257. isInvalid: [
  258. {
  259. required: true,
  260. message: '请选择是否作废',
  261. trigger: 'change'
  262. },
  263. ],
  264. invalidCause: [
  265. {
  266. required: true,
  267. message: '请输入作废原因',
  268. trigger: 'blur'
  269. },
  270. ],
  271. checkResult: [
  272. {
  273. required: true,
  274. message: '请选择结果',
  275. trigger: 'change'
  276. },
  277. ],
  278. auditFailCause: [
  279. {
  280. required: true,
  281. message: '请输入失败原因',
  282. trigger: 'blur'
  283. },
  284. ],
  285. },
  286. }
  287. },
  288. onShow(){
  289. },
  290. onLoad(item){
  291. this.getDetail(item.id)
  292. },
  293. onReady() {
  294. this.$refs.form.setRules(this.rules)
  295. },
  296. methods: {
  297. openScan(){
  298. // 允许从相机和相册扫码
  299. let that = this;
  300. uni.scanCode({
  301. success: function (res) {
  302. that.form.qrCode = res.result
  303. }
  304. });
  305. },
  306. async getDetail(id){
  307. const result= await this.api.request('wx/productRework/api/detail?id='+id,{},'get',"application/x-www-form-urlencoded")
  308. this.details = result;
  309. if(this.details.repairsImgs){
  310. this.details.repairsList = this.details.repairsImgs.split(",");
  311. }
  312. if(this.details.reworkImgs){
  313. this.details.reworkList = this.details.reworkImgs.split(",");
  314. }
  315. },
  316. // 预览图片
  317. doPreviewImage(url, images) {
  318. uni.previewImage({
  319. urls: images,
  320. current: url,
  321. success: () => {
  322. },
  323. fail: () => {
  324. this.showToast('预览图片失败')
  325. }
  326. })
  327. },
  328. showInfoForm(){
  329. this.showForm = true
  330. this.$refs.form.resetFields()
  331. },
  332. closedPopup(){
  333. this.showForm = false
  334. },
  335. imageUploadChange(data,index,datas){
  336. this.form.images = datas;
  337. },
  338. radioGroupChange(data){
  339. },
  340. submit(){
  341. let that = this;
  342. this.$refs.form.validate(valid => {
  343. if (valid) {
  344. // 验证通过
  345. let form = {}
  346. form.id = that.details.id
  347. let url = 'wx/productRework/api/rework';
  348. if(that.details.status<2){
  349. form.isInvalid = that.form.isInvalid
  350. if(that.form.isInvalid==0){
  351. let urls = [];
  352. for(let i=0;i<that.form.images.length;i++){
  353. let url = that.form.images[i].url
  354. urls.push(url)
  355. }
  356. form.reworkImgs = urls.join()
  357. if(that.form.qrCode){
  358. form.qrCode = that.form.qrCode
  359. }
  360. }else{
  361. form.invalidCause = that.form.invalidCause
  362. }
  363. }else{
  364. form.auditFailCause = that.form.auditFailCause
  365. form.status = that.form.checkResult==1?(that.details.isInvalid==1?-1:3):0
  366. url = 'wx/productRework/api/check';
  367. }
  368. that.api.request(url,form,'post','').then((res) => {
  369. uni.navigateBack({
  370. success: function (e) {
  371. var page = getCurrentPages().pop();
  372. if (page == undefined || page == null) return;
  373. page.onLoad();
  374. },
  375. });
  376. }).catch((res) => {
  377. console.log(res);
  378. })
  379. } else {
  380. // 验证失败
  381. }
  382. })
  383. },
  384. }
  385. }
  386. </script>
  387. <style lang="scss" scoped>
  388. .list-icon-text, .list-image-text {
  389. display: flex;
  390. align-items: center;
  391. justify-content: space-between;
  392. }
  393. .list {
  394. &__left {
  395. display: flex;
  396. align-items: center;
  397. justify-content: flex-start;
  398. min-width: 140rpx;
  399. &__icon, &__image {
  400. margin-right: 18rpx;
  401. }
  402. }
  403. &__right {
  404. display: flex;
  405. align-items: center;
  406. justify-content: flex-end;
  407. flex-wrap: wrap;
  408. }
  409. }
  410. .tn-image-upload {
  411. display: flex;
  412. flex-direction: row;
  413. flex-wrap: wrap;
  414. align-items: center;
  415. &__item {
  416. /* #ifndef APP-NVUE */
  417. display: flex;
  418. /* #endif */
  419. align-items: center;
  420. justify-content: center;
  421. width: 200rpx;
  422. height: 200rpx;
  423. overflow: hidden;
  424. margin: 12rpx;
  425. margin-left: 0;
  426. background-color: $tn-font-holder-color;
  427. position: relative;
  428. border-radius: 10rpx;
  429. &-preview {
  430. border: 1rpx solid $tn-border-solid-color;
  431. &__image {
  432. display: block;
  433. width: 100%;
  434. height: 100%;
  435. border-radius: 10rpx;
  436. }
  437. }
  438. }
  439. }
  440. </style>