add.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. <!-- @format -->
  2. <template>
  3. <view class="container" style="padding-bottom: 20rpx">
  4. <u-alert
  5. type="warning"
  6. :show-icon="true"
  7. description="(1)小程序目前仅支持出租汽车计价器、出租汽车税控计价器台账制作,其他类型器具请前往电脑端添加。\n(2)此类器具提交后自动通过强检备案,可进行检定申请。"
  8. ></u-alert>
  9. <u-form
  10. :model="form"
  11. :rules="rules"
  12. ref="uForm"
  13. labelWidth="180"
  14. labelPosition="top"
  15. >
  16. <u-divider text="基础信息" :textSize="18" textColor="black"></u-divider>
  17. <u-form-item :required="true" label="器具类型:" prop="typeName">
  18. <u-input disabled v-model="form.typeName"></u-input>
  19. </u-form-item>
  20. <u-form-item :required="true" label="器具用途:" prop="purposeName">
  21. <u-input disabled v-model="form.purposeName"></u-input>
  22. </u-form-item>
  23. <u-form-item :required="true" label="器具名称:" prop="name">
  24. <zxz-uni-data-select
  25. dataKey="name"
  26. dataValue="name"
  27. :filterable="false"
  28. v-model="form.name"
  29. :localdata="localdata"
  30. placeholder="请下拉选择"
  31. emptyTips="没有查找到器具名称"
  32. ></zxz-uni-data-select>
  33. </u-form-item>
  34. <u-form-item :required="true" label="器具项别:" prop="categoryName">
  35. <u-input
  36. disabled
  37. placeholder="请输入器具项别"
  38. v-model="form.categoryName"
  39. ></u-input>
  40. </u-form-item>
  41. <u-form-item :required="true" label="器具种别:" prop="className">
  42. <u-input
  43. disabled
  44. placeholder="请输入器具种别"
  45. v-model="form.className"
  46. ></u-input>
  47. </u-form-item>
  48. <u-form-item :required="true" label="专业类别:" prop="majorName">
  49. <u-input disabled v-model="form.majorName"></u-input>
  50. </u-form-item>
  51. <u-form-item
  52. :required="true"
  53. label="强检一级目录:"
  54. prop="catalogueOneName"
  55. >
  56. <u-input disabled v-model="form.catalogueOneName"></u-input>
  57. </u-form-item>
  58. <u-form-item
  59. :required="true"
  60. label="强检二级目录:"
  61. prop="catalogueTwoName"
  62. >
  63. <u-input disabled v-model="form.catalogueTwoName"></u-input>
  64. </u-form-item>
  65. <u-form-item :required="true" label="制造单位:" prop="manufactoryNameId">
  66. <zxz-uni-data-select
  67. @inputChange="hadnleSearch"
  68. dataKey="name"
  69. dataValue="id"
  70. :filterable="true"
  71. v-model="form.manufactoryNameId"
  72. :localdata="zzdwLocaldata"
  73. placeholder="请输入制造单位查询并选择"
  74. emptyTips="未找到"
  75. ></zxz-uni-data-select>
  76. </u-form-item>
  77. <u-form-item :required="true" label="规格型号:" prop="modelSpecific">
  78. <u-input
  79. v-model="form.modelSpecific"
  80. placeholder="请按照器具铭牌进行填写"
  81. ></u-input>
  82. </u-form-item>
  83. <u-form-item :required="true" label="出厂编号:" prop="serialNumber">
  84. <u-input
  85. v-model="form.serialNumber"
  86. placeholder="请按照器具铭牌进行填写"
  87. ></u-input>
  88. </u-form-item>
  89. <u-form-item :required="true" label="内部编号:" prop="internalNumber">
  90. <u-input
  91. v-model="form.internalNumber"
  92. placeholder="请填写当天日期+车牌号"
  93. ></u-input>
  94. </u-form-item>
  95. <u-form-item :required="true" label="使用状态:" prop="useStatus">
  96. <zxz-uni-data-select
  97. dataKey="name"
  98. dataValue="id"
  99. :filterable="true"
  100. v-model="form.useStatus"
  101. :localdata="syztLocaldata"
  102. placeholder="请选择使用状态"
  103. emptyTips="未找到"
  104. ></zxz-uni-data-select>
  105. </u-form-item>
  106. <u-form-item :required="true" label="使用单位:" prop="useUnitName">
  107. <u-input disabled v-model="form.useUnitName"></u-input>
  108. </u-form-item>
  109. <u-form-item :required="true" label="使用区域:" prop="useAddrCode">
  110. <vvSelectArea
  111. :list="areas"
  112. v-model="useAddrName"
  113. placeholder="请选择使用区域"
  114. ></vvSelectArea>
  115. </u-form-item>
  116. <u-divider text="技术参数" :textSize="18" textColor="black"></u-divider>
  117. <u-form-item :required="true" label="测量范围:" prop="measureRange">
  118. <u-input v-model="form.measureRange"></u-input>
  119. </u-form-item>
  120. <u-form-item :required="true" label="准确度等级:" prop="accuracyLevel">
  121. <u-input v-model="form.accuracyLevel"></u-input>
  122. </u-form-item>
  123. <u-form-item :required="true" label="允许误差:" prop="indicationError">
  124. <u-input v-model="form.indicationError"></u-input>
  125. </u-form-item>
  126. <u-divider text="强检证明" :textSize="18" textColor="black"></u-divider>
  127. <u-alert
  128. type="warning"
  129. :show-icon="true"
  130. description="请按当地计量行政部门规定要求,本平台只提供功能,不作要求"
  131. ></u-alert>
  132. <u-form-item label="贸易结算的相关证明:" prop="">
  133. <u-upload
  134. :fileList="fileList1"
  135. @afterRead="afterRead"
  136. @delete="deletePic"
  137. name="1"
  138. multiple
  139. :maxCount="1"
  140. ></u-upload>
  141. </u-form-item>
  142. <u-form-item
  143. label="最近一次检定证书或新购置器具的购销合同或发票:"
  144. prop=""
  145. labelWidth="400"
  146. >
  147. <u-upload
  148. :fileList="fileList2"
  149. @afterRead="afterRead"
  150. @delete="deletePic"
  151. name="2"
  152. multiple
  153. :maxCount="1"
  154. ></u-upload>
  155. </u-form-item>
  156. <u-form-item
  157. labelWidth="300"
  158. label="含有出厂编号规格型号的铭牌图片:"
  159. prop=""
  160. >
  161. <u-upload
  162. :fileList="fileList3"
  163. @afterRead="afterRead"
  164. @delete="deletePic"
  165. name="3"
  166. multiple
  167. :maxCount="1"
  168. ></u-upload>
  169. </u-form-item>
  170. <u-divider text="其他信息" :textSize="18" textColor="black"></u-divider>
  171. <u-form-item label="生产日期:" prop="" >
  172. <view @click="productionDateShow=true">
  173. <u-input
  174. readonly
  175. v-model="form.productionDate"
  176. placeholder="请选择生产日期"
  177. ></u-input>
  178. </view>
  179. <u-datetime-picker @confirm="productionDateConfirm" @cancel="productionDateShow = false" :show="productionDateShow" v-model="form.productionDate" mode="date">
  180. </u-datetime-picker>
  181. </u-form-item>
  182. <u-form-item label="购置日期:" prop="">
  183. <view @click="purchaseDateShow=true">
  184. <u-input
  185. v-model="form.purchaseDate"
  186. placeholder="请选择购置日期"
  187. ></u-input>
  188. </view>
  189. <u-datetime-picker @confirm="purchaseDateConfirm" @cancel="purchaseDateShow = false" :show="purchaseDateShow" v-model="form.purchaseDate" mode="date">
  190. </u-datetime-picker>
  191. </u-form-item>
  192. <u-form-item label="使用位置:" prop="">
  193. <u-input
  194. v-model="form.setupPlace"
  195. placeholder="请填写使用位置"
  196. ></u-input>
  197. </u-form-item>
  198. <u-form-item label="使用部门:" prop="">
  199. <u-input
  200. v-model="form.useDeptName"
  201. placeholder="请填写使用部门"
  202. ></u-input>
  203. </u-form-item>
  204. <u-form-item label="保管人员:" prop="">
  205. <u-input
  206. v-model="form.custodianName"
  207. placeholder="请填写保管人员"
  208. ></u-input>
  209. </u-form-item>
  210. <u-form-item label="保管手机号:" prop="">
  211. <u-input
  212. placeholder="请填写保管人员手机号"
  213. v-model="form.custodianMobile"
  214. ></u-input>
  215. </u-form-item>
  216. <u-form-item label="保管身份证号:" prop="">
  217. <u-input
  218. placeholder="请填写保管人员身份证号"
  219. v-model="form.custodianIdCard"
  220. ></u-input>
  221. </u-form-item>
  222. </u-form>
  223. <view class="btn">
  224. <u-button
  225. class="custom-style"
  226. @click="cancel"
  227. :plain="true"
  228. shape="circle"
  229. type="primary"
  230. >取消</u-button
  231. >
  232. <u-button
  233. class="custom-style"
  234. @click="onSubmit"
  235. shape="circle"
  236. type="primary"
  237. >提交</u-button
  238. >
  239. </view>
  240. <view style="height: 130rpx"></view>
  241. </view>
  242. </template>
  243. <script>
  244. import { getToken } from "@/utils/auth";
  245. import { getManufacturingUnits, getArea, submitAddExternal } from "@/api/qj";
  246. import vvSelectArea from "@/pagesB/components/vv-select-area/vv-select-area";
  247. export default {
  248. components: {
  249. vvSelectArea,
  250. },
  251. data() {
  252. return {
  253. productionDateShow: false,
  254. purchaseDateShow: false,
  255. userInfo: {},
  256. fileList1: [],
  257. fileList2: [],
  258. fileList3: [],
  259. useAddrName: null,
  260. localdata: [
  261. {
  262. name: "出租汽车计价器",
  263. },
  264. {
  265. name: "出租汽车税控计价器",
  266. },
  267. ],
  268. syztLocaldata: [
  269. {
  270. id: "1",
  271. name: "在用",
  272. },
  273. {
  274. id: "2",
  275. name: "停用",
  276. },
  277. {
  278. id: "3",
  279. name: "禁用",
  280. },
  281. ],
  282. areas: [],
  283. zzdwLocaldata: [],
  284. form: {
  285. dictInstrumentId: "481",
  286. instrumentNameId: 7682,
  287. name: "出租汽车税控计价器",
  288. typeCode: "3",
  289. typeName: "工作计量器具",
  290. strong: 1,
  291. purposeCode: "6",
  292. purposeName: "贸易结算",
  293. useStatus: "",
  294. categoryCode: 474,
  295. categoryName: "车速里程表及出租车计价器",
  296. classCode: 468,
  297. className: "转速",
  298. majorCode: 253,
  299. majorName: "力学",
  300. catalogueOne: 42,
  301. catalogueOneName: "出租汽车计价器",
  302. catalogueTwo: 43,
  303. catalogueTwoName: "出租汽车计价器",
  304. manufactoryName: "",
  305. manufactoryNameId: "",
  306. modelSpecific: "",
  307. licenceNumber: "",
  308. serialNumber: "",
  309. productionDate: "",
  310. internalNumber: "",
  311. useAddrCode: "",
  312. useAddrName: "",
  313. orgAddrName: "江中省南方市向西县",
  314. useUnitName: "南方市向西县黄袍怪电子公司",
  315. useUnitId: "",
  316. setupPlace: "",
  317. purchaseDate: "",
  318. useDeptId: "",
  319. useDeptName: "",
  320. custodianId: "",
  321. custodianName: "",
  322. custodianMobile: "",
  323. custodianIdCard: "",
  324. imgPath: "",
  325. data: "",
  326. measureRange: "(0~9999)m",
  327. indicationError: "-4.0%~+1.0%",
  328. accuracyLevel: "-4.0%~+1.0%",
  329. divisionValue: "",
  330. editMode: "INSTR",
  331. imgPath: null,
  332. },
  333. rules: {
  334. typeName: [
  335. {
  336. required: true,
  337. message: "器具类型不能为空",
  338. trigger: "blur",
  339. },
  340. ],
  341. purposeName: [
  342. {
  343. required: true,
  344. message: "器具用途不能为空",
  345. trigger: "blur",
  346. },
  347. ],
  348. name: [
  349. {
  350. required: true,
  351. message: "器具名称不能为空",
  352. trigger: "blur",
  353. },
  354. ],
  355. categoryName: [
  356. {
  357. required: true,
  358. message: "器具项别不能为空",
  359. trigger: "blur",
  360. },
  361. ],
  362. className: [
  363. {
  364. required: true,
  365. message: "器具种别不能为空",
  366. trigger: "blur",
  367. },
  368. ],
  369. majorName: [
  370. {
  371. required: true,
  372. message: "专业类别不能为空",
  373. trigger: "blur",
  374. },
  375. ],
  376. catalogueOneName: [
  377. {
  378. required: true,
  379. message: "强检一级目录不能为空",
  380. trigger: "blur",
  381. },
  382. ],
  383. catalogueTwoName: [
  384. {
  385. required: true,
  386. message: "强检二级目录不能为空",
  387. trigger: "blur",
  388. },
  389. ],
  390. manufactoryNameId: [
  391. {
  392. required: true,
  393. message: "制造单位不能为空",
  394. trigger: "blur",
  395. },
  396. ],
  397. modelSpecific: [
  398. {
  399. required: true,
  400. message: "规格型号不能为空",
  401. trigger: "blur",
  402. },
  403. ],
  404. serialNumber: [
  405. {
  406. required: true,
  407. message: "出厂编号不能为空",
  408. trigger: "blur",
  409. },
  410. ],
  411. internalNumber: [
  412. {
  413. required: true,
  414. message: "内部编号不能为空",
  415. trigger: "blur",
  416. },
  417. ],
  418. useStatus: [
  419. {
  420. required: true,
  421. message: "使用状态不能为空",
  422. trigger: "blur",
  423. },
  424. ],
  425. useUnitName: [
  426. {
  427. required: true,
  428. message: "使用单位不能为空",
  429. trigger: "blur",
  430. },
  431. ],
  432. orgAddrName: [
  433. {
  434. required: true,
  435. message: "单位区域不能为空",
  436. trigger: "blur",
  437. },
  438. ],
  439. useAddrCode: [
  440. {
  441. required: true,
  442. message: "使用区域不能为空",
  443. trigger: "blur",
  444. },
  445. ],
  446. measureRange: [
  447. {
  448. required: true,
  449. message: "测量范围不能为空",
  450. trigger: "blur",
  451. },
  452. ],
  453. accuracyLevel: [
  454. {
  455. required: true,
  456. message: "准确度等级不能为空",
  457. trigger: "blur",
  458. },
  459. ],
  460. indicationError: [
  461. {
  462. required: true,
  463. message: "允许误差不能为空",
  464. trigger: "blur",
  465. },
  466. ],
  467. },
  468. };
  469. },
  470. async onLoad(option) {},
  471. computed: {},
  472. onReady() {
  473. //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
  474. this.$refs.uForm.setRules(this.rules);
  475. },
  476. watch: {
  477. useAddrName(newVal) {
  478. this.form.useAddrCode = this.useAddrName.join(",");
  479. },
  480. },
  481. async created() {
  482. try {
  483. let { data } = await getArea();
  484. this.areas = data;
  485. } catch (error) {}
  486. this.userInfo = JSON.parse(uni.getStorageSync("userInfo"));
  487. this.form.useUnitName = this.userInfo.mechanism.name;
  488. this.form.useAddrCode = this.userInfo.mechanism.region;
  489. console.log(this.form.useAddrCode);
  490. },
  491. methods: {
  492. productionDateConfirm: async function(e) {
  493. this.form.productionDate = await uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
  494. console.log(this.form.productionDate);
  495. this.productionDateShow = false
  496. },
  497. purchaseDateConfirm: async function(e) {
  498. this.form.purchaseDate = await uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
  499. console.log(this.form.purchaseDate);
  500. this.purchaseDateShow = false
  501. },
  502. //上传
  503. uploadFilePromise(url) {
  504. return new Promise((resolve, reject) => {
  505. let a = uni.uploadFile({
  506. url: `${this.$baseUrl}/api/instrument/upload`, // 仅为示例,非真实的接口地址
  507. filePath: url,
  508. name: "file",
  509. header: {
  510. Authorization: "Bearer " + getToken(),
  511. },
  512. success: (res) => {
  513. setTimeout(() => {
  514. resolve(res);
  515. }, 1000);
  516. },
  517. });
  518. });
  519. },
  520. deletePic(event) {
  521. this[`fileList${event.name}`].splice(event.index, 1);
  522. },
  523. // 新增图片
  524. async afterRead(event) {
  525. // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
  526. let lists = [].concat(event.file);
  527. let fileListLen = this[`fileList${event.name}`].length;
  528. lists.map((item) => {
  529. this[`fileList${event.name}`].push({
  530. ...item,
  531. status: "uploading",
  532. message: "上传中",
  533. });
  534. });
  535. for (let i = 0; i < lists.length; i++) {
  536. const result = await this.uploadFilePromise(lists[i].url);
  537. let item = this[`fileList${event.name}`][fileListLen];
  538. this[`fileList${event.name}`].splice(
  539. fileListLen,
  540. 1,
  541. Object.assign(item, {
  542. status: "success",
  543. message: "",
  544. url: JSON.parse(result.data).fileName,
  545. })
  546. );
  547. fileListLen++;
  548. }
  549. },
  550. //获取制造单位
  551. async hadnleSearch(row) {
  552. let { data } = await getManufacturingUnits({
  553. mechanismName: row,
  554. });
  555. this.zzdwLocaldata = data;
  556. },
  557. //取消
  558. cancel() {
  559. uni.navigateBack();
  560. },
  561. //提交
  562. onSubmit() {
  563. console.log(this.form);
  564. if (
  565. this.fileList1.length ||
  566. this.fileList2.length ||
  567. this.fileList3.length
  568. ) {
  569. // const imgMapping = {
  570. // tradeProved: [
  571. // {
  572. // name: "贸易结算的相关证明",
  573. // url: this.fileList1.length ? this.fileList1[0].url : "",
  574. // },
  575. // ],
  576. // lastTest: [
  577. // {
  578. // name: "最近一次检定证书或新购置器具的购销合同或发票",
  579. // url: this.fileList2.length ? this.fileList2[0].url : "",
  580. // },
  581. // ],
  582. // modelImage: [
  583. // {
  584. // name: "含有出厂编号规格型号的铭牌图片",
  585. // url: this.fileList3.length ? this.fileList3[0].url : "",
  586. // },
  587. // ],
  588. // };
  589. const imgMapping = {};
  590. if (this.fileList1.length) {
  591. imgMapping["tradeProved"] = [
  592. {
  593. name: "贸易结算的相关证明",
  594. url: this.fileList1.length ? this.fileList1[0].url : "",
  595. },
  596. ];
  597. }
  598. if (this.fileList2.length) {
  599. imgMapping["lastTest"] = [
  600. {
  601. name: "最近一次检定证书或新购置器具的购销合同或发票",
  602. url: this.fileList2.length ? this.fileList2[0].url : "",
  603. },
  604. ];
  605. }
  606. if (this.fileList3.length) {
  607. imgMapping["modelImage"] = [
  608. {
  609. name: "含有出厂编号规格型号的铭牌图片",
  610. url: this.fileList3.length ? this.fileList3[0].url : "",
  611. },
  612. ];
  613. }
  614. this.form.imgPath = JSON.stringify(imgMapping);
  615. }
  616. this.$refs.uForm.validate().then(async (res) => {
  617. try {
  618. uni.showLoading({
  619. title: "提交中....",
  620. });
  621. await submitAddExternal(this.form);
  622. uni.showToast({
  623. title: "提交成功",
  624. //显示持续时间为 2秒
  625. duration: 2000,
  626. });
  627. uni.redirectTo({
  628. url: "/pagesB/Ledger/list",
  629. });
  630. } finally {
  631. }
  632. });
  633. },
  634. },
  635. };
  636. </script>
  637. <style lang="scss">
  638. .titleMessage {
  639. font-size: 34rpx;
  640. font-weight: bold;
  641. margin-left: -15rpx;
  642. }
  643. .btn {
  644. display: flex;
  645. justify-content: space-between;
  646. align-items: center;
  647. background: #fff;
  648. padding: 20rpx;
  649. position: fixed;
  650. bottom: 0;
  651. left: 0;
  652. z-index: 99;
  653. width: 100%;
  654. }
  655. .container {
  656. height: 100%;
  657. padding: 30rpx;
  658. background: #fff;
  659. }
  660. </style>