add.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. <template>
  2. <view>
  3. <u-navbar :titleLong="fieldInfo.title">
  4. </u-navbar>
  5. <view class="businessMain" :style="'font-size:'+fieldInfo.fontsize+'rpx'">
  6. <view class="businessTitle" v-if="false">{{fieldInfo.title}}</view>
  7. <view v-for="(item,i) in fieldList" :key="i" class="oawork-item" :class="getClass(item)">
  8. <template v-if="item.type.indexOf('uview')>-1">
  9. <view v-if="item.type.indexOf('divider')>-1">
  10. <u-divider bg-color="#fff" border-color="#6d6d6d">{{item.text}}</u-divider>
  11. </view>
  12. </template>
  13. <template v-else-if="item.type.indexOf('tableList')>-1&&formData[item.key]&&formData[item.key].length">
  14. <view v-if="item.type.indexOf('tableList-vertical')>-1">
  15. <u-table align="left">
  16. <u-tr class="u-tr">
  17. <u-th class="u-th"></u-th>
  18. <u-th class="u-th" v-for="(num2,index2) in item.num"
  19. :key="index2+'it'">{{item.text}}{{index2+1}}</u-th>
  20. </u-tr>
  21. <u-tr class="u-tr" v-for="(it,index) in item.list" :key="index+'it'">
  22. <u-td class="u-td" style="flex-direction: unset;">{{it.text}}<span v-if="it.isrequset"
  23. style="color:red">*</span></u-td>
  24. <u-td class="u-td" v-for="(num2,index2) in item.num" :key="index2+'it'">
  25. <u-input v-model="formData[item.key][index2][it.key]" :placeholder="'填写'+it.text"
  26. :placeholderStyle="placeholderStyle" class="oawork-line" :type="it.unit"
  27. :maxlength="it.unit?10:20"
  28. :customStyle="{textAlign: 'right1', minHeight: 0}" />
  29. </u-td>
  30. </u-tr>
  31. </u-table>
  32. </view>
  33. <view
  34. v-if="item.type.indexOf('tableList-horizontal')>-1&&formData[item.key]&&formData[item.key].length">
  35. <u-table align="left">
  36. <u-tr class="u-tr">
  37. <u-th class="u-th" style="flex-direction: unset;" v-for="(it,index) in item.list"
  38. :key="index+'it'">{{it.text}}<span v-if="it.isrequset"
  39. style="color:red">*</span></u-th>
  40. </u-tr>
  41. <u-tr class="u-tr" v-for="(num2,index2) in item.num" :key="index2+'it'">
  42. <u-td class="u-td" v-for="(it,index) in item.list" :key="index+'it'">
  43. <u-input v-model="formData[item.key][index2][it.key]" :placeholder="'填写'+it.text"
  44. :placeholderStyle="placeholderStyle" class="oawork-line" :type="it.unit"
  45. :customStyle="{textAlign: 'right1', minHeight: 0}" />
  46. </u-td>
  47. </u-tr>
  48. </u-table>
  49. </view>
  50. </template>
  51. <template v-else>
  52. <view class="oawork-item1">
  53. <view class="oawork-item1_a" v-if="item.text">{{item.serial}}{{item.text}}<span
  54. v-if="item.isrequset" style="color:red">*</span>
  55. </view>
  56. <view class="oawork-item1_b"
  57. v-if="item.role==null||item.role.indexOf('0')>-1||item.role.indexOf('0')>-1">
  58. <template v-if="item.view">
  59. {{formData[item.key]?formData[item.key]:getViewItem(item)}}
  60. </template>
  61. <template v-else>
  62. <template v-if="item.type.indexOf('text')>-1">
  63. <u-input v-model="formData[item.key]" :placeholder="'请输入'+item.text"
  64. :placeholderStyle="placeholderStyle" class="oawork-line"
  65. :customStyle="{textAlign: 'right1'}" />
  66. </template>
  67. <template v-if="item.type.indexOf('textnumber')>-1">
  68. <u-input v-model="formData[item.key]" type="number" :placeholder="'请输入'+item.text"
  69. :placeholderStyle="placeholderStyle" class="oawork-line"
  70. :customStyle="{textAlign: 'right1'}" />
  71. </template>
  72. <template v-if="item.type.indexOf('radio')>-1">
  73. <u-radio-group v-model="formData[item.key]">
  74. <u-radio v-for="(item, index) in item.list?item.list:radioListDefault"
  75. :key="index" :name="item.value">
  76. {{item.name}}
  77. </u-radio>
  78. </u-radio-group>
  79. </template>
  80. <template v-if="item.type.indexOf('selecttime')>-1">
  81. <u-calendar max-date="2060-01-01" v-model="showCalendar" mode="date"
  82. @change="changeCalendar"></u-calendar>
  83. <view @click="showCalendar = true,keyCalendar=item">
  84. {{formData[item.key]?formData[item.key]:getViewItem(item)}}
  85. </view>
  86. </template>
  87. <template v-if="item.type.indexOf('selecttime2')>-1">
  88. <u-calendar max-date="2060-01-01" v-model="showCalendar" mode="range"
  89. @change="changeCalendar2"></u-calendar>
  90. <view @click="showCalendar = true,keyCalendar=item">
  91. {{formData[item.key]?formData[item.key]:createTime}}至{{formData[item.key2]?formData[item.key2]:createTime}}
  92. </view>
  93. </template>
  94. </template>
  95. </view>
  96. <view class="oawork-item1_c" v-if="item.type.indexOf('unit')>-1">
  97. {{item.unit}}
  98. </view>
  99. </view>
  100. <view class="oawork-item2"
  101. v-if="item.role==null||item.role.indexOf('0')>-1||item.role.indexOf('0')>-1">
  102. <template v-if="item.type.indexOf('textlong')>-1">
  103. <u-input v-model="formData[item.key]" :placeholder="'请输入'+item.text"
  104. :placeholderStyle="placeholderStyle" class="oawork-line" type="textarea" />
  105. </template>
  106. </view>
  107. </template>
  108. </view>
  109. <view class="submitBtn" v-if="isReady">
  110. <u-button type="info" :class="{
  111. submitBtn30:isReady
  112. }" @click="submit(0)">保存</u-button>
  113. <u-button type="primary" class="submitBtn60" @click="submit(1)">提交</u-button>
  114. </view>
  115. </view>
  116. <!-- <approve-view :activityList="activityList" :initStart="false"></approve-view -->
  117. </view>
  118. </template>
  119. <script>
  120. import {
  121. dataJsGetInfo
  122. } from '../data.js'
  123. import * as API from '@/apis/pagejs/oa.js'
  124. import approveView from '@/components/ApproveView.vue'
  125. import {
  126. currentTimeStamp,
  127. parseUnixTime,
  128. } from '@/apis/utils'
  129. export default {
  130. components: {
  131. approveView
  132. },
  133. data() {
  134. return {
  135. //editor
  136. readOnly: false,
  137. formats: {},
  138. editorCtx: "",
  139. //editor
  140. oatype: "",
  141. showCalendar: false,
  142. keyCalendar: {},
  143. placeholderStyle: "font-size: 24rpx",
  144. radioListDefault: [{
  145. name: '是',
  146. value: '1'
  147. }, {
  148. name: '否',
  149. value: '0'
  150. }, ],
  151. fieldInfo: {},
  152. fieldList: [],
  153. activityList: [
  154. ],
  155. action: "",
  156. formData: {},
  157. personInfo: {},
  158. createTime: "",
  159. createTime2: "",
  160. uploadData: {},
  161. fileList: [],
  162. header: {
  163. },
  164. id: "",
  165. placeholder: '开始输入...',
  166. isReady: true,
  167. themeWordKey: "",
  168. }
  169. },
  170. onLoad(op) {
  171. this.oatype = 11
  172. this.fieldInfo = dataJsGetInfo(this.oatype)
  173. this.fieldList = this.fieldInfo.list;
  174. this.init()
  175. if (op.id) {
  176. this.id = op.id
  177. this.getProcessDetails();
  178. }
  179. },
  180. computed: {
  181. },
  182. methods: {
  183. sum1() {
  184. var num = 0;
  185. console.log("sum1sum1sum1")
  186. for (var i in this.formData.waybillCostList) {
  187. var item = this.formData.waybillCostList[i]
  188. if (item.amount) {
  189. num += item.amount
  190. }
  191. }
  192. return num
  193. },
  194. inspect() {
  195. // if (!this.form.verifyCode) {
  196. // uni.showToast({
  197. // title: "请输入验证码",
  198. // icon: "none"
  199. // })
  200. // return
  201. // }
  202. for (var i in this.fieldList) {
  203. var item = this.fieldList[i]
  204. if (item.isrequset) {
  205. //(item)
  206. var key = this.formData[item.key]
  207. if (!key) {
  208. console.log(item.key)
  209. uni.showToast({
  210. title: "请输入" + item.text,
  211. icon: "none"
  212. })
  213. return false
  214. }
  215. }
  216. }
  217. return true
  218. },
  219. submit(draftStatus) {
  220. this.submitApi(draftStatus);
  221. },
  222. submitApi(draftStatus) {
  223. var submitObj = {
  224. ...this.formData
  225. }
  226. if (draftStatus) {
  227. var c = this.inspect()
  228. if (!c) {
  229. return
  230. }
  231. }
  232. var draftStatusBl=false;
  233. var draftStatusBlName='';
  234. // submitObj.waybillInfo.waybillCostList=''
  235. // submitObj.waybillInfo.waybillGoodsList=''
  236. var sz1 = [ "waybillGoodsList","waybillCostList"]
  237. var szBl1 = ["货物列表", "现付费用"]
  238. var szBl2 = ["货品名称", "费别"]
  239. var szBl3 = ["name", "category"]
  240. for (var i in sz1) {
  241. var key = sz1[i]
  242. var sz2 = []
  243. var sz3 = submitObj[key];
  244. var sortNo = 1;
  245. for (var j in sz3) {
  246. var obj = sz3[j]
  247. var bl = false
  248. for (var k in obj) {
  249. if (obj[k] != '') {
  250. bl = true
  251. }
  252. }
  253. if(draftStatus&&bl){
  254. var draftStatuskey=szBl3[i]
  255. console.log(draftStatus,bl,obj[draftStatuskey],obj,draftStatuskey)
  256. if(obj[draftStatuskey] == ''){
  257. draftStatusBl=true
  258. console.log("szBl1"+szBl1[i]+szBl2[i])
  259. draftStatusBlName=szBl1[i]+"-"+szBl2[i];
  260. uni.showToast({
  261. title: "请完整填写一条" + draftStatusBlName,
  262. icon: "none"
  263. })
  264. return
  265. }
  266. }
  267. if (bl) {
  268. obj.sortNo = sortNo
  269. sortNo++;
  270. sz2.push(obj);
  271. }
  272. }
  273. submitObj[key] = sz2
  274. }
  275. uni.showLoading({
  276. title: "加载中",
  277. mask: true,
  278. })
  279. submitObj.status = draftStatus?0:-1
  280. API.applyWayBill(submitObj).then((res) => {
  281. uni.hideLoading();
  282. const eventChannel = this.getOpenerEventChannel();
  283. eventChannel.emit('refreshData');
  284. uni.showModal({
  285. title: "提示",
  286. showCancel: false,
  287. content: "操作成功!",
  288. success() {
  289. uni.navigateBack()
  290. }
  291. })
  292. ////(this.formData.maintenanceDescription,res.data.applyContent.maintenanceDescription)
  293. }).catch(error => {
  294. uni.showToast({
  295. title: error,
  296. icon: "none"
  297. })
  298. })
  299. },
  300. getProcessDetails() {
  301. uni.showLoading({
  302. title: "加载中",
  303. mask: true,
  304. })
  305. API.waybillDetails({
  306. formId: this.oatype,
  307. id: this.id
  308. }).then((res) => {
  309. uni.hideLoading();
  310. var applyContent = res.data.waybillInfo
  311. if (applyContent) {
  312. this.formData.id = applyContent.id
  313. for (var i in this.fieldList) {
  314. var obj = this.fieldList[i];
  315. //(this.formData[obj.key], applyContent[obj.key])
  316. var data = applyContent[obj.key];
  317. if (data == null) {
  318. continue
  319. }
  320. console.log(obj.key,applyContent[obj.key])
  321. this.formData[obj.key] = applyContent[obj.key]
  322. if (obj.type.indexOf('tableList') > -1) {
  323. //var sz = []
  324. for (var k = this.formData[obj.key].length; k < obj.num; k++) {
  325. var ob = {}
  326. for (var j in obj.list) {
  327. var io = obj.list[j]
  328. ob[io.key] = ""
  329. }
  330. this.formData[obj.key].push(ob)
  331. }
  332. //this.formData[obj.key] = sz
  333. }
  334. if(applyContent.status!=-1){
  335. this.isReady=false
  336. }
  337. }
  338. this.$forceUpdate();
  339. }
  340. }).catch(error => {
  341. uni.showToast({
  342. title: error,
  343. icon: "none"
  344. })
  345. })
  346. },
  347. saveStorage() {
  348. },
  349. gotoSelectPerson(item) {
  350. this.saveStorage();
  351. uni.navigateTo({
  352. url: "/pages/oawork/business/select"
  353. })
  354. },
  355. changeCalendar(e) {
  356. this.formData[this.keyCalendar.key] = e.result;
  357. },
  358. changeCalendar2(e) {
  359. this.formData[this.keyCalendar.key] = e.startDate;
  360. this.formData[this.keyCalendar.key2] = e.endDate;
  361. },
  362. init() {
  363. this.personInfo = this.carhelp.getPersonInfo()
  364. this.createTime = parseUnixTime(currentTimeStamp(), '{y}-{m}-{d}');
  365. this.createTime2 = parseUnixTime(currentTimeStamp());
  366. for (var i in this.fieldList) {
  367. var obj = this.fieldList[i];
  368. this.formData[obj.key] = ""
  369. if (obj.type.indexOf('texteditor') > -1) {
  370. this.themeWordKey = obj.key
  371. console.log("this.themeWordKey", this.themeWordKey)
  372. }
  373. if (obj.type.indexOf('tableList') > -1) {
  374. var sz = []
  375. for (var k = 0; k < obj.num; k++) {
  376. var ob = {}
  377. for (var j in obj.list) {
  378. var io = obj.list[j]
  379. ob[io.key] = ""
  380. }
  381. sz.push(ob)
  382. }
  383. this.formData[obj.key] = sz
  384. }
  385. }
  386. console.log(this.formData)
  387. this.action = process.car.BASE_URL + "uploadPicture"
  388. this.uploadData.subFolder = "oawork11" + this.oatype;
  389. //接口应该免登陆
  390. var token = this.carhelp.getToken()
  391. this.header = {
  392. 'Authorization': token
  393. }
  394. },
  395. getViewItem(item) {
  396. //(item)
  397. if (item.sql) {
  398. var obj = this;
  399. for (var i in item.sql) {
  400. var k = item.sql[i];
  401. obj = obj[k]
  402. this.formData[item.key] = obj
  403. }
  404. return obj;
  405. }
  406. return "填写" + item.text;
  407. },
  408. getClass(item) {
  409. if (item) {
  410. var list = item.type.map(it => {
  411. return 'oawork-' + it
  412. })
  413. return list.join(' ')
  414. }
  415. },
  416. }
  417. }
  418. </script>
  419. <style scoped lang="scss">
  420. .oawork-line {
  421. border-bottom: 1px solid #c8c8c8;
  422. }
  423. .oawork-paddingTop {
  424. padding-top: 40rpx;
  425. }
  426. .approveMain_text {
  427. font-weight: bold;
  428. color: rgba(51, 51, 51, 1);
  429. font-size: 32rpx;
  430. padding-bottom: 20rpx;
  431. padding-left: 32rpx;
  432. border-bottom: 1px solid #C8C8C8;
  433. margin-bottom: 16rpx;
  434. // padding-top: 32rpx;
  435. }
  436. .businessMain {
  437. /deep/.uni-input-input {
  438. font-size: 24rpx;
  439. }
  440. font-size: 32rpx;
  441. background: #fff;
  442. padding-top: 10rpx;
  443. padding-bottom: 180rpx;
  444. margin-bottom: 40rpx;
  445. display: flex;
  446. flex-wrap: wrap;
  447. .oawork-item {
  448. padding: 4rpx 16rpx 4rpx 16rpx;
  449. width: 100%;
  450. .oawork-item1 {
  451. display: flex;
  452. align-items: center;
  453. .oawork-item1_a {
  454. min-width: 160rpx;
  455. font-weight: bold;
  456. }
  457. .oawork-item1_b {
  458. color: #777777;
  459. width: 100%;
  460. text-align: right;
  461. }
  462. .oawork-item1_c {
  463. // padding-left: 2rpx;
  464. }
  465. }
  466. }
  467. .oawork-selecttime,
  468. .oawork-selecttime2 {
  469. margin: 10rpx 0;
  470. display: flex;
  471. .oawork-item1 {
  472. width: 100%;
  473. }
  474. .oawork-item1_b {
  475. display: flex;
  476. align-items: center;
  477. justify-content: flex-end;
  478. height: 100%;
  479. border-bottom: 1px solid #c8c8c8;
  480. }
  481. }
  482. .oawork-itemrow {
  483. .oawork-item1_a {
  484. font-weight: 400 !important;
  485. width: 200%;
  486. }
  487. }
  488. // .oawork-itemline {
  489. // .oawork-item1_a {
  490. // width: 100%;
  491. // }
  492. // }
  493. .oawork-texteditor {
  494. margin-top: 10px;
  495. }
  496. .oawork-textlong,
  497. .oawork-itemline {
  498. .oawork-item1_a {
  499. width: 100%;
  500. }
  501. }
  502. .oawork-title {
  503. padding: 20rpx 0px 4rpx 20rpx;
  504. .oawork-item1_a {
  505. width: 100%;
  506. font-size: 32rpx;
  507. }
  508. }
  509. .width200 {
  510. // padding:20rpx 0px 4rpx 20rpx;
  511. .oawork-item1_a {}
  512. }
  513. /deep/.oawork-width49 {
  514. padding: 4rpx 0px 4rpx 10rpx;
  515. width: 49%;
  516. .oawork-item1_a {
  517. font-size: 28rpx;
  518. min-width: 140rpx !important;
  519. }
  520. }
  521. }
  522. .approveMain {
  523. background: #fff;
  524. padding-bottom: 180rpx;
  525. padding-top: 20rpx;
  526. .approveItem_main {
  527. display: flex;
  528. justify-content: space-between;
  529. margin-bottom: 30rpx;
  530. margin-right: 32rpx;
  531. .approveItem_a1 {
  532. .approveItem_a1_text1 {
  533. color: rgba(16, 16, 16, 1);
  534. font-size: 32rpx;
  535. }
  536. .approveItem_a1_text2 {
  537. margin-bottom: 16rpx;
  538. color: rgba(119, 119, 119, 1);
  539. font-size: 24rpx;
  540. }
  541. .approveItem_a1_text3 {
  542. color: rgba(51, 51, 51, 1);
  543. font-size: 24rpx;
  544. display: flex;
  545. flex-direction: row;
  546. flex-wrap: wrap;
  547. .approveItem_a1_text3Img {
  548. margin-right: 40rpx;
  549. margin-top: 10rpx;
  550. /deep/.u-badge {
  551. position: relative !important;
  552. top: -40rpx !important;
  553. right: 10rpx !important;
  554. }
  555. }
  556. }
  557. }
  558. .approveItem_a2 {
  559. .a2_span {
  560. border-radius: 4px;
  561. text-align: center;
  562. border: 1px solid rgba(227, 227, 227, 1);
  563. width: 72rpx;
  564. height: 72rpx;
  565. line-height: 60rpx;
  566. font-size: 48rpx;
  567. color: #9F9F9F;
  568. }
  569. .a2_span_2 {
  570. position: relative;
  571. top: -84rpx;
  572. left: 60rpx;
  573. color: red;
  574. }
  575. }
  576. }
  577. }
  578. .u-node {
  579. width: 18rpx;
  580. height: 18rpx;
  581. border-radius: 100rpx !important;
  582. display: flex;
  583. justify-content: center;
  584. align-items: center;
  585. background: #d0d0d0;
  586. }
  587. .submitBtn {
  588. bottom: 0;
  589. position: fixed;
  590. width: 100%;
  591. padding: 20rpx 40rpx;
  592. background-color: #fff;
  593. border-top: 3px solid #f3f4f4;
  594. z-index: 99;
  595. display: flex;
  596. .submitBtn30 {
  597. width: 30%;
  598. }
  599. .submitBtn60 {
  600. width: 60%;
  601. }
  602. }
  603. @import "../data/editor-icon.css";
  604. </style>