You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

add-work-order.vue 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <view class="bg">
  3. <view class="title_wrap"><text class="title">基本信息</text></view>
  4. <car-number-input @numberInputResult="carNumber" :defaultStr="state.form.vehiclePlate"></car-number-input>
  5. <u-form label-width="230" :model="state.form" ref="uForm" :label-style='labelStyle'>
  6. <u-form-item label="车牌颜色" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  7. borderBottom>
  8. <u-input v-model="state.form.vehiclePlateColorStr" type="select" @click="show1 = true" input-align='right'/>
  9. </u-form-item>
  10. <u-form-item label="姓名" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  11. borderBottom>
  12. <u-input placeholder='请输入姓名' v-model="state.form.customerName" maxlength="18"
  13. inputAlign="right" />
  14. </u-form-item>
  15. <u-form-item label="联系方式" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  16. borderBottom>
  17. <u-input placeholder='请输入手机号码' type="number" v-model="state.form.customerTel" maxlength="11"
  18. inputAlign="right" />
  19. </u-form-item>
  20. </u-form>
  21. </view>
  22. <view class="bg">
  23. <view class="title">工单信息</view>
  24. <u-form label-width="230" :model="state.form" ref="uForm" :label-style='labelStyle' borderBottom>
  25. <u-form-item label="工单类型" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  26. borderBottom>
  27. <u-input v-model="state.form.questionTypeStr" type="select" @click="show2 = true" input-align='right'/>
  28. </u-form-item>
  29. <u-form-item label="是否ETC用户" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  30. borderBottom>
  31. <u-input v-model="state.form.etcUserStr" type="select" @click="show3 = true" input-align='right'/>
  32. </u-form-item>
  33. <u-form-item label="事件发生日期" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  34. borderBottom>
  35. <picker mode="date" @change="bindDateChange">
  36. <view class="picker" v-if="!state.form.eventOccurrenceDate">
  37. 请选择日期
  38. </view>
  39. <view class="data">
  40. {{state.form.eventOccurrenceDate}}
  41. </view>
  42. </picker>
  43. </u-form-item>
  44. <u-form-item label="客户投诉" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  45. borderBottom>
  46. </u-form-item>
  47. <textarea v-model="state.form.appeal" style="border: 1rpx dashed rgb(192, 196, 204);min-height: 200rpx; width: 100%;border-radius: 18rpx;padding: 20rpx;box-sizing: border-box;" placeholder="请输入述求" auto-height adjust-position></textarea>
  48. <u-form-item label="其他佐证材料" :left-icon='`${$imgUrl}issuance/point-form.png`' :left-icon-style='leftIcon'
  49. borderBottom>
  50. <text class="common-word">(不限于图片、文件、不超过5个。)</text>
  51. </u-form-item>
  52. <view class="down-wrap" v-for="(item,index) in state.form.supportingMaterialsUrlShow" :key="index">
  53. <text>附件{{index+1}}</text>
  54. <view>
  55. <text class="down" @click="down(item,index)">预览</text>
  56. <text class="down" @click="deleteFile(index)">删除</text>
  57. </view>
  58. </view>
  59. <button type="default" class="ui-btn-another" @click="addFile()">
  60. +添加附件
  61. </button>
  62. </u-form>
  63. </view>
  64. <view class="action">
  65. <button type="default" class="ui-btn" @click="savaHandle()">
  66. 提交
  67. </button>
  68. </view>
  69. <!-- 选择车牌颜色 -->
  70. <u-select v-model="show1" :list="state.colorRange" @confirm="changeColor"></u-select>
  71. <!-- 工单类型 -->
  72. <u-select v-model="show2" :list="state.questionTypeRange" @confirm="changeQuestionType"></u-select>
  73. <!-- -->
  74. <u-select v-model="show3" :list="state.etcUserRange" @confirm="changeEtcUser"></u-select>
  75. </template>
  76. <script setup lang="ts">
  77. import { navTo,msg,uploadFile} from "@/utils/utils";
  78. import { reactive,ref } from "vue";
  79. import carNumberInput from "@/components/car-number-input/car-number-input.vue";
  80. import { onLoad } from "@dcloudio/uni-app";
  81. import { getItem } from "@/utils/storage.ts"
  82. import {requestNew} from "@/utils/network/request.js";
  83. import {selfServiceUserAdd} from "@/utils/network/api.js";
  84. const labelStyle = {
  85. color: "#004576",
  86. fontSize: "28rpx",
  87. }
  88. const leftIcon = {
  89. height: '100%',
  90. width: '8rpx',
  91. display: 'flex',
  92. 'align-items': 'center',
  93. 'margin-right': '4rpx',
  94. }
  95. const show1 = ref(false)
  96. const show2 = ref(false)
  97. const show3 = ref(false)
  98. const state = reactive({
  99. form: {
  100. customerName: "",
  101. customerTel: "",
  102. vehiclePlate: "",
  103. vehiclePlateColor: "",
  104. vehiclePlateColorStr:"",//车牌颜色中文
  105. questionType:"",
  106. questionTypeStr:"",
  107. etcUser:"",
  108. etcUserStr:"",
  109. eventOccurrenceDate:"",//2016-09-01 00:00:00
  110. appeal:"",
  111. supportingMaterialsUrl:"",
  112. supportingMaterialsUrlShow:[]
  113. },
  114. colorRange: [],
  115. questionTypeRange:[
  116. {value: 1, label: "工单1"},
  117. {value: 2, label: "工单2"},
  118. ],
  119. etcUserRange:[
  120. {value: 1, label: "是"},
  121. {value: 0, label: "否"},
  122. ],
  123. })
  124. onLoad((option : any) => {
  125. let getColor = getItem('key')['VEHICLE_COLOR_TYPE'];
  126. for (var k = 0; k < getColor.length; k++) {
  127. let obj = {};
  128. obj['value'] = getColor[k]['code']
  129. obj['label'] = getColor[k]['name']
  130. state.colorRange.push(obj)
  131. }
  132. console.log("state.colorRange",state.colorRange)
  133. });
  134. //车牌号输入
  135. const carNumber = (val : any) => {
  136. state.form.vehiclePlate = val.trim();
  137. };
  138. const changeColor = (item) => {
  139. state.form.vehiclePlateColor = item[0].value
  140. state.form.vehiclePlateColorStr = item[0].label
  141. console.log(item)
  142. }
  143. const changeQuestionType = (item) => {
  144. state.form.questionType = item[0].value
  145. state.form.questionTypeStr = item[0].label
  146. console.log(item)
  147. }
  148. const changeEtcUser = (item) => {
  149. state.form.etcUser = item[0].value
  150. state.form.etcUserStr = item[0].label
  151. console.log(item)
  152. }
  153. const bindDateChange=(e)=>{
  154. console.log('picker发送选择改变,携带值为', e.detail.value)
  155. state.form.eventOccurrenceDate= e.detail.value
  156. }
  157. const savaHandle = () => {
  158. if(!state.form.vehiclePlate){
  159. msg('请输入车牌号');
  160. return;
  161. }
  162. if(!state.form.vehiclePlateColor){
  163. msg('请选择车牌颜色');
  164. return;
  165. }
  166. if(!state.form.customerName){
  167. msg('请输入姓名');
  168. return;
  169. }
  170. if(!state.form.customerTel){
  171. msg('请输入手机号码');
  172. return;
  173. }
  174. if(!state.form.questionType){
  175. msg('请选择工单类型');
  176. return;
  177. }
  178. if(!state.form.etcUser){
  179. msg('请选择是否ETC用户');
  180. return;
  181. }
  182. if(!state.form.eventOccurrenceDate){
  183. msg('请选择事件发生日期');
  184. return;
  185. }
  186. if(!state.form.appeal){
  187. msg('请输入述求');
  188. return;
  189. }
  190. if(!state.form.supportingMaterialsUrlShow){
  191. msg('请上传其他佐证材料');
  192. return;
  193. }
  194. state.form.eventOccurrenceDate=state.form.eventOccurrenceDate+" 00:00:00"
  195. state.form.supportingMaterialsUrl=state.form.supportingMaterialsUrlShow.toString()
  196. const options = {
  197. type: 2,
  198. data: {
  199. ...state.form
  200. },
  201. method: "POST",
  202. showLoading: true,
  203. };
  204. requestNew(selfServiceUserAdd, options).then((res) => {
  205. console.log("添加成功",res)
  206. msg("新增自助工单成功")
  207. setTimeout(()=>{
  208. uni.navigateBack()
  209. },1500)
  210. });
  211. }
  212. const addFile=()=>{
  213. const count =5-state.form.supportingMaterialsUrlShow.length
  214. uni.chooseMessageFile({
  215. count: count,
  216. type: 'all',
  217. success (res) {
  218. // tempFilePath可以作为img标签的src属性显示图片
  219. console.log("res",res)
  220. var files=res.tempFiles
  221. for(var i=0;i<files.length;i++){
  222. uploadFile(files[i]['path'], "", "").then((data) => {
  223. state.form.supportingMaterialsUrlShow.push(data);
  224. console.log("state.form.supportingMaterialsUrlShow",state.form.supportingMaterialsUrlShow)
  225. })
  226. }
  227. }
  228. })
  229. }
  230. const down=(item,index)=>{
  231. // 找到最后一个点(.)的位置
  232. const lastDotIndex = item.lastIndexOf(".");
  233. // 截取最后一个点后面的内容
  234. const result = item.substring(lastDotIndex+1);
  235. if(result=='jpg' || result=='png'){
  236. uni.previewImage({
  237. urls:[item],
  238. longPressActions: {
  239. itemList: ['发送给朋友', '保存图片', '收藏'],
  240. success: function(data) {
  241. console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
  242. },
  243. fail: function(err) {
  244. console.log(err.errMsg);
  245. }
  246. }
  247. });
  248. }else{
  249. uni.downloadFile({
  250. url: item,
  251. filePath: wx.env.USER_DATA_PATH + '/附件' +index ,
  252. success(res) {
  253. console.log("下载",res)
  254. const filePath = res.filePath
  255. uni.openDocument({
  256. filePath: filePath,
  257. fileType: result,
  258. showMenu: true, //关键点
  259. success: function (res) {
  260. msg("打开文档成功");
  261. },
  262. fail: function (err) {
  263. msg("打开文档失败");
  264. }
  265. });
  266. },
  267. fail: function (err) {
  268. msg("下载文档失败");
  269. console.log("err", err)
  270. },
  271. complete(res) {
  272. }
  273. })
  274. }
  275. }
  276. const deleteFile=(index)=>{
  277. state.form.supportingMaterialsUrlShow.splice(index,1)
  278. }
  279. </script>
  280. <style lang="scss" scoped>
  281. .bg {
  282. background-color: white;
  283. width: 88%;
  284. margin: 0 auto;
  285. margin-top: 20rpx;
  286. border-radius: 12px;
  287. border: 1px solid #FFFFFF;
  288. padding: 20rpx;
  289. overflow: hidden;
  290. .title_wrap {
  291. display: flex;
  292. font-weight: 400;
  293. margin-bottom: 40rpx;
  294. .title {
  295. font-size: 30rpx;
  296. color: #01243A;
  297. }
  298. }
  299. .des {
  300. font-weight: 400;
  301. font-size: 28rpx;
  302. color: #01243A;
  303. line-height: 56rpx;
  304. margin-top: 10rpx;
  305. text-indent: 1rem;
  306. }
  307. }
  308. .action {
  309. position: absolute;
  310. left: 0;
  311. height: 188rpx;
  312. background-color: #fff;
  313. border-radius: 30rpx 30rpx 0 0;
  314. width: 100vw;
  315. display: flex;
  316. align-items: center;
  317. justify-content: center;
  318. flex-direction: column;
  319. margin-top: 20rpx;
  320. }
  321. .picker{
  322. text-align: right;
  323. color: rgb(192, 196, 204);
  324. }
  325. .data{
  326. text-align: right;
  327. }
  328. .five{
  329. color: rgb(195,188,157);
  330. }
  331. .down-wrap{
  332. display: flex;
  333. justify-content: space-between;
  334. margin-bottom: 35rpx;
  335. .down{
  336. width: 100rpx;
  337. height: 50rpx;
  338. border-radius: 20rpx;
  339. background:linear-gradient(90deg, #CCB375 0%, #E7D398 100%);
  340. font-weight: 400;
  341. font-size: 24rpx;
  342. color: #FFFFFF;
  343. text-align: center;
  344. line-height: 50rpx;
  345. display: inline-block;
  346. margin-left: 16rpx;
  347. }
  348. }
  349. </style>