awayOffice.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. <template>
  2. <div>
  3. <van-nav-bar title="出差管理" left-text="返回" @click-left="back" fixed left-arrow style="z-index:1000" />
  4. <div class="content" v-show="!isSyncData">
  5. <van-tabs v-model="active" @change="activeChange">
  6. <van-tab title="出差填报" :name="0" v-if="awayOfficeFil"></van-tab>
  7. <van-tab title="出差列表" :name="1" v-if="awayOfficeList"></van-tab>
  8. <van-tab title="出差审核" :name="2" v-if="awayOfficeAudit"></van-tab>
  9. </van-tabs>
  10. <div class="edit" v-if="active == 0">
  11. <van-form class="edit_form" ref="loginForm" label-width="120">
  12. <!-- 出差事由 -->
  13. <van-field v-model="editForm.reason" label="出差事由" type="textarea" :autosize="{minHeight:50}" required :rules="[{ required: true, message: '请填写出差事由' }]"></van-field>
  14. <!-- 请假类型 -->
  15. <van-field v-model="editForm.way" label="交通工具" @click="typeShow = true" readonly clickable>
  16. <template #input>{{typeList[editForm.way]}}</template>
  17. </van-field>
  18. <van-popup v-model="typeShow" position="bottom">
  19. <van-picker
  20. show-toolbar
  21. :columns="typeList"
  22. @confirm="typeChange"
  23. @cancel="typeShow = false;$forceUpdate();"/>
  24. </van-popup>
  25. <!-- 请假人 -->
  26. <van-field v-model="editForm.cityFrom" label="出发城市" @click="ownerIdShow = true,cityType = 1" clickable required :rules="[{ required: true, message: '请选择出发城市' }]">
  27. <template #input>
  28. <span>{{ editForm.cityFrom }}</span>
  29. </template>
  30. </van-field>
  31. <van-field v-model="editForm.cityTo" label="目的城市" @click="ownerIdShow = true,cityType = 2" clickable required :rules="[{ required: true, message: '请选择出发城市' }]">
  32. <template #input>
  33. <span>{{ editForm.cityTo }}</span>
  34. </template>
  35. </van-field>
  36. <van-popup v-model="ownerIdShow" position="bottom">
  37. <div style="minHeight:300px;">
  38. <van-radio-group v-model="userRadio">
  39. <van-radio v-for="item in cityList" :key="item.id" :name="item" class="userCheckbox">{{item.label}}</van-radio>
  40. </van-radio-group>
  41. <van-button style="width:100%;position: -webkit-sticky;position: sticky;bottom: 0;" @click="cityToChange()">确定</van-button>
  42. </div>
  43. </van-popup>
  44. <!-- 单程往返 -->
  45. <van-field label="单程往返" readonly>
  46. <template #input>
  47. <van-radio-group v-model="editForm.goBack" direction="horizontal" @change="timeTypeChange">
  48. <van-radio name="0">单程</van-radio>
  49. <van-radio name="1">往返</van-radio>
  50. </van-radio-group>
  51. </template>
  52. </van-field>
  53. <!-- 选择日期 -->
  54. <van-field label="选择日期" v-model="formshowText.dateTitle" @click="dateShow()" readonly clickable required :rules="[{ required: true, message: '请选择日期'}]">
  55. <template #input><span>{{formshowText.dateTitle}}</span></template>
  56. </van-field>
  57. <!-- 按天 -->
  58. <van-calendar v-model="dateShow_day" type="range" :allow-same-day="true" :show-confirm="false" @confirm="date_dayChange" :min-date="minDate" :max-date="maxDate" />
  59. <!-- 出差天数 -->
  60. <van-field label="出差天数(天)" @blur="dayBlur()" v-model="editForm.dayCount" type="number" :rules="[{ required: true, message: '请输入请假天数' }]"></van-field>
  61. <!-- 备注 -->
  62. <van-field v-model="editForm.remark" label="备注" type="textarea" :autosize="{minHeight:100}"></van-field>
  63. </van-form>
  64. <!-- 提交 -->
  65. <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
  66. <div style="padding-bottom:10px;" v-if="editForm.id">
  67. <van-button square block type="default" @click="clearEditForm()" style="width:100%;float:left;">清除</van-button>
  68. </div>
  69. <div style="padding-bottom:10px;">
  70. <van-button square block type="info" @click="submitLeave()" :loading="submitLoading" style="width:100%;float:left;">提交</van-button>
  71. </div>
  72. </div>
  73. </div>
  74. <div class="list" v-if="active == 1">
  75. <van-collapse v-model="activeName" accordion class="list_collapse">
  76. <van-collapse-item v-for="item in leaveList" :key="item.id" title="标题1" :name="item.id">
  77. <template #title>
  78. <div class="collapse_label_l">人员:
  79. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
  80. <span v-else>{{item.ownerName}}</span>
  81. </div>
  82. <div class="collapse_label_r">天数:{{item.dayCount}}</div>
  83. <div class="collapse_label_l">行程:{{item.cityFrom + '-' + item.cityTo}}</div>
  84. <div class="collapse_label_r">状态:<span :class="statusClass[item.status]">{{statusList[item.status]}}</span></div>
  85. </template>
  86. <div class="wrapper">
  87. <div><span>交通工具:</span><span>{{typeList[item.way]}}</span></div>
  88. <div><span>申请时间:</span><span>{{item.indate}}</span></div>
  89. <div><span>出差开始时间:</span><span>{{item.startDate}}</span></div>
  90. <div><span>出差结束时间:</span><span>{{item.endDate}}</span></div>
  91. <div><span>备注:</span><span>{{item.remark}}</span></div>
  92. </div>
  93. <div class="operation" v-if="(item.status != 0 && item.ownerId == user.id) || leaveAll">
  94. <van-button v-if="item.status == 3 || item.status == 2" size="small" type="info" @click="submitAgain(item)">重新提交</van-button>
  95. <van-button v-if="item.status == 3 || item.status == 2" style="margin-left:10px" size="small" type="danger" @click="deleteLeave(item.id)">删除</van-button>
  96. <van-button v-if="item.status == 1" style="margin-left:10px" size="small" type="default" @click="cancelLeave(item.id)">撤回</van-button>
  97. </div>
  98. </van-collapse-item>
  99. </van-collapse>
  100. </div>
  101. <div class="audit" v-if="active == 2">
  102. <van-collapse v-model="auditName" accordion class="list_collapse">
  103. <van-collapse-item v-for="item in auditList" :key="item.id" title="标题2" :name="item.id">
  104. <template #title>
  105. <div class="collapse_label_l">人员:
  106. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
  107. <span v-else>{{item.ownerName}}</span>
  108. </div>
  109. <div class="collapse_label_r">天数:{{item.dayCount}}</div>
  110. <div class="collapse_label_l">行程:{{item.cityFrom + '-' + item.cityTo}}</div>
  111. <div class="collapse_label_r">状态:<span :class="statusClass[item.status]">{{statusList[item.status]}}</span></div>
  112. <div class="operation">
  113. <van-button size="small" type="info" :loading="item.approveLoading" @click.stop="approveLeave(item)">通过</van-button>
  114. <van-button style="margin-left:15px" size="small" type="danger" @click.stop="denyLeave(item.id)">驳回</van-button>
  115. </div>
  116. </template>
  117. <div class="wrapper">
  118. <div><span>交通工具:</span><span>{{typeList[item.way]}}</span></div>
  119. <div><span>申请时间:</span><span>{{item.indate}}</span></div>
  120. <div><span>出差开始时间:</span><span>{{item.startDate}}</span></div>
  121. <div><span>出差结束时间:</span><span>{{item.endDate}}</span></div>
  122. <div><span>备注:</span><span>{{item.remark}}</span></div>
  123. </div>
  124. </van-collapse-item>
  125. </van-collapse>
  126. <van-popup v-model="denyReasonDialog" position="bottom" closeable >
  127. <van-cell>请输入原因</van-cell>
  128. <van-field class="form_input"
  129. v-model="denyParm.denyReason" name="reason" type="textarea" placeholder="请输入您决定驳回的原因"
  130. rows="3" autosize />
  131. <van-button style="width:100%;" type="info" :loading="denyLoading" @click="deny()">提交</van-button>
  132. </van-popup>
  133. </div>
  134. </div>
  135. <!-- 钉钉同步 -->
  136. <div class="content" v-show="isSyncData">
  137. <div class="list">
  138. <van-collapse v-model="activeName" accordion class="list_collapse">
  139. <van-collapse-item v-for="item in leaveList" :key="item.id" title="标题1" :name="item.id">
  140. <template #title>
  141. <div class="collapse_label_l">人员:
  142. <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.ownerName'></ww-open-data></span>
  143. <span v-else>{{item.ownerName}}</span>
  144. </div>
  145. <div class="collapse_label_r">天数:{{item.dayCount}}天</div>
  146. <div class="collapse_label_l">交通工具:{{typeList[item.way]}}</div>
  147. <div class="collapse_label_r">状态:<span :class="statusClass[item.status]">{{statusList[item.status]}}</span></div>
  148. </template>
  149. <div class="wrapper">
  150. <div><span>出差详情:</span>
  151. <span v-for="items in item.projectList" :key="items.projectId">
  152. <span>{{items.startDate + '至' + items.endDate}}</span><span>{{items.projectName}}</span><span>{{items.degreeName}}</span>
  153. </span>
  154. </div>
  155. <div><span>出差开始时间:</span><span>{{item.startDate}}</span></div>
  156. <div><span>出差结束时间:</span><span>{{item.endDate}}</span></div>
  157. <div><span>备注:</span><span>{{item.remark}}</span></div>
  158. </div>
  159. <!-- <div class="operation">
  160. <van-button size="small" type="info" @click="submitAgain(item)">关联</van-button>
  161. </div> -->
  162. </van-collapse-item>
  163. </van-collapse>
  164. </div>
  165. </div>
  166. </div>
  167. </template>
  168. <script>
  169. // 映入城市
  170. import citys from '../../assets/shju.json'
  171. export default {
  172. data() {
  173. return {
  174. isSyncData: 0,
  175. wuduData: JSON.parse(localStorage.userInfo).timeType,
  176. user: JSON.parse(localStorage.userInfo),
  177. awayOfficeFil: false,
  178. awayOfficeAudit: false,
  179. awayOfficeList: false,
  180. canExamine: false,
  181. leaveAll: false,
  182. leaveAudit: false,
  183. leaveFil: false,
  184. active: 0,
  185. txselnum: 0,
  186. cityType: '',
  187. cityList: [],
  188. cityList2: [],
  189. editForm: {
  190. reason: '',
  191. startDate: '',
  192. endDate: '',
  193. way: 0,
  194. cityFrom: '',
  195. cityTo: '',
  196. goBack: '0',
  197. dayCount: 0,
  198. remark: '',
  199. projectId: '',
  200. wuduId: '',
  201. },
  202. formshowText: {
  203. name: '',
  204. dateTitle: ''
  205. },
  206. userRadio: null,
  207. userList: [],
  208. typeList: ['飞机','火车','汽车','轮船','其他'],
  209. currentDate: new Date(),
  210. minDate: new Date(2020,0,1),
  211. maxDate: new Date(2030,11,31),
  212. ownerIdShow: false,
  213. canExamine: false,
  214. dateShow_day: false,
  215. dateShow_hour: false,
  216. typeShow: false,
  217. submitLoading: false,
  218. activeName: '',
  219. leaveList: [],
  220. statusList: ['审核通过','待审核','已驳回','已撤销'],
  221. statusClass: ['','waiting','rejected',''],
  222. auditName: '',
  223. auditList: [],
  224. denyReasonDialog: false,
  225. denyLoading: false,
  226. denyParm: {
  227. id: '',
  228. denyReason: ''
  229. }
  230. }
  231. },
  232. filters: {
  233. departureCity(str, json) {
  234. for(var i in json) {
  235. if(json[i].value == str) {
  236. return json[i].label
  237. }
  238. }
  239. }
  240. },
  241. mounted() {
  242. this.cityList = citys
  243. this.cityList2 = citys
  244. this.isSyncData = (this.wuduData.syncDingding || this.wuduData.syncFanwei)
  245. console.log(this.isSyncData, '是否是钉钉')
  246. for(let i in this.user.functionList){
  247. if(this.user.functionList[i].name == '查看全部出差'){
  248. this.leaveAll = true
  249. }
  250. if(this.user.functionList[i].name == '出差填报'){
  251. this.awayOfficeFil = true
  252. }
  253. if(this.user.functionList[i].name == '出差审核'){
  254. this.awayOfficeAudit = true
  255. }
  256. }
  257. if(this.isSyncData) {
  258. this.getLeaveList()
  259. } else {
  260. this.awayOfficeList = true
  261. if(this.awayOfficeAudit) {
  262. this.active = '2'
  263. this.getAuditList()
  264. }
  265. if(this.awayOfficeFil) {
  266. this.active = '0'
  267. }
  268. }
  269. this.getTxsel()
  270. },
  271. methods: {
  272. back(){
  273. history.back();
  274. },
  275. getDaysBetween(date1,date2){
  276. let startDate = Date.parse(date1);
  277. let endDate = Date.parse(date2);
  278. if (startDate>endDate){
  279. return 0;
  280. }
  281. if (startDate==endDate){
  282. return 1;
  283. }
  284. let days=(endDate - startDate)/(1*24*60*60*1000);
  285. return days + 1;
  286. },
  287. formatDate(date) {
  288. let mon = date.getMonth() + 1
  289. return `${date.getFullYear()}-${mon<10?'0'+mon:mon}-${date.getDate()<10?'0'+date.getDate():date.getDate()}`;
  290. },
  291. activeChange(){
  292. sessionStorage.setItem('page',JSON.stringify(this.active))
  293. if(this.active == 1){
  294. this.getLeaveList()
  295. }
  296. if(this.active == 2){
  297. this.getAuditList()
  298. }
  299. },
  300. // #region
  301. cityToChange(){
  302. if(this.cityType == 1) {
  303. this.editForm.cityFrom = this.userRadio ? this.userRadio.label : ''
  304. }
  305. if(this.cityType == 2) {
  306. this.editForm.cityTo = this.userRadio ? this.userRadio.label : ''
  307. }
  308. this.ownerIdShow = false
  309. },
  310. timeTypeChange(){
  311. if(this.editForm.startDate && this.editForm.endDate){
  312. this.formshowText.dateTitle = this.editForm.startDate+'\u3000至\u3000'+this.editForm.endDate
  313. }else{
  314. this.formshowText.dateTitle = ''
  315. }
  316. },
  317. dateShow(){
  318. this.dateShow_day = true
  319. },
  320. date_dayChange(value,date){
  321. this.dateShow_day = false
  322. this.editForm.startDate = this.formatDate(value[0])
  323. this.editForm.endDate = this.formatDate(value[1])
  324. this.formshowText.dateTitle = this.formatDate(value[0])+'\u3000至\u3000'+this.formatDate(value[1])
  325. this.editForm.dayCount = this.getDaysBetween(value[0],value[1])
  326. },
  327. date_hourChange(value){
  328. this.editForm.startDate = this.formatDate(value)
  329. this.formshowText.dateTitle = this.editForm.startDate
  330. this.dateShow_hour = false
  331. },
  332. dayBlur(){
  333. if(this.editForm.startDate && this.editForm.endDate){
  334. if(this.editForm.dayCount*1 < this.getDaysBetween(this.editForm.startDate,this.editForm.endDate) - 1){
  335. this.editForm.dayCount = this.getDaysBetween(this.editForm.startDate,this.editForm.endDate) - 1
  336. }else if(this.editForm.dayCount*1 > this.getDaysBetween(this.editForm.startDate,this.editForm.endDate)){
  337. this.editForm.dayCount = this.getDaysBetween(this.editForm.startDate,this.editForm.endDate)
  338. }
  339. }
  340. },
  341. hourBlur(){
  342. if(this.editForm.timeHours*1 > this.user.timeType.allday){
  343. this.editForm.timeHours = this.user.timeType.allday
  344. }
  345. if(this.editForm.timeHours*1 < 0){
  346. this.editForm.timeHours = 0.5
  347. }
  348. },
  349. typeChange(value,key){
  350. this.editForm.way = key
  351. this.typeShow = false
  352. },
  353. submitLeave(){
  354. this.$refs.loginForm.validate().then(()=>{
  355. console.log('success');
  356. this.submitLoading = true
  357. console.log(this.editForm, '看看数据')
  358. // return
  359. this.$axios.post("/business-trip/add", this.editForm)
  360. .then(res => {
  361. this.submitLoading = false
  362. if(res.code == "ok") {
  363. this.editForm = {
  364. reason: '',
  365. startDate: '',
  366. endDate: '',
  367. way: 0,
  368. cityFrom: '',
  369. cityTo: '',
  370. goBack: '0',
  371. dayCount: 0,
  372. remark: '',
  373. projectId: '',
  374. wuduId: '',
  375. }
  376. this.formshowText.dateTitle = ''
  377. this.$toast.success('提交成功');
  378. } else {
  379. this.$toast.fail(res.msg);
  380. }
  381. }).catch(err=> {this.submitLoading = false;this.$toast.clear();console.log(err)});
  382. }).catch(()=>{})
  383. },
  384. clearEditForm(){
  385. this.editForm = {
  386. reason: '',
  387. startDate: '',
  388. endDate: '',
  389. way: 0,
  390. cityFrom: '',
  391. cityTo: '',
  392. goBack: '0',
  393. dayCount: 0,
  394. remark: '',
  395. projectId: '',
  396. wuduId: '',
  397. }
  398. this.formshowText.dateTitle = ''
  399. },
  400. // #endregion
  401. // #region
  402. cancelLeave(pid){
  403. this.$dialog.confirm({
  404. message: '确认撤回?',
  405. })
  406. .then(() => {
  407. // on confirm
  408. this.$axios.post("/business-trip/cancel", {id: pid})
  409. .then(res => {
  410. if(res.code == "ok") {
  411. this.$toast.success('撤回成功')
  412. this.getLeaveList()
  413. } else {
  414. this.$toast.fail('获取失败');
  415. }
  416. }).catch(err=> {this.$toast.clear();console.log(err)});
  417. })
  418. .catch(() => {
  419. // on cancel
  420. });
  421. },
  422. deleteLeave(pid){
  423. this.$dialog.confirm({
  424. message: '确认删除?',
  425. })
  426. .then(() => {
  427. // on confirm
  428. this.$axios.post("/business-trip/delete", {id: pid})
  429. .then(res => {
  430. if(res.code == "ok") {
  431. this.$toast.success('删除成功')
  432. this.getLeaveList()
  433. } else {
  434. this.$toast.fail('获取失败');
  435. }
  436. }).catch(err=> {this.$toast.clear();console.log(err)});
  437. })
  438. .catch(() => {
  439. // on cancel
  440. });
  441. },
  442. submitAgain(item){
  443. item.goBack = item.goBack + ''
  444. this.editForm = {
  445. id: item.id,
  446. reason: item.reason,
  447. startDate: item.startDate,
  448. endDate: item.endDate,
  449. way: item.way,
  450. cityFrom: item.cityFrom,
  451. cityTo: item.cityTo,
  452. goBack: item.goBack,
  453. dayCount: item.dayCount,
  454. remark: item.remark,
  455. projectId: item.projectId,
  456. wuduId: item.wuduId,
  457. }
  458. this.timeTypeChange()
  459. console.log(item, '数据')
  460. this.active = 0
  461. },
  462. // #endregion
  463. approveLeave(item){
  464. item.approveLoading = true
  465. this.$axios.post("/business-trip/approve", {id: item.id})
  466. .then(res => {
  467. if(res.code == "ok") {
  468. this.$toast.success('已通过')
  469. item.approveLoading = false
  470. this.getAuditList()
  471. } else {
  472. this.$toast.fail('获取失败');
  473. }
  474. }).catch(err=> {this.$toast.clear();console.log(err)});
  475. },
  476. denyLeave(pid){
  477. this.denyParm.id = pid
  478. this.denyReasonDialog = true
  479. },
  480. deny(){
  481. this.denyLoading = true
  482. this.$axios.post("/business-trip/deny", this.denyParm)
  483. .then(res => {
  484. if(res.code == "ok") {
  485. this.$toast.success('已驳回')
  486. this.denyReasonDialog = false
  487. this.denyLoading = false
  488. this.getAuditList()
  489. } else {
  490. this.$toast.fail('获取失败');
  491. }
  492. }).catch(err=> {this.$toast.clear();console.log(err)});
  493. },
  494. getUserList(){
  495. this.$axios.post("/user/getSimpleActiveUserList", {})
  496. .then(res => {
  497. if(res.code == "ok") {
  498. this.userList = res.data
  499. } else {
  500. this.$toast.fail('获取失败');
  501. }
  502. }).catch(err=> {this.$toast.clear();console.log(err)});
  503. },
  504. getTxsel(){
  505. this.$axios.post("/leave-sheet/getOTAvaiDays", {userId: this.user.id})
  506. .then(res => {
  507. if(res.code == "ok") {
  508. if(res.data < 0.5){
  509. this.txselnum = 0
  510. }else{
  511. this.txselnum = res.data.toFixed(1)
  512. }
  513. } else {
  514. this.$toast.fail('获取失败');
  515. }
  516. }).catch(err=> {this.$toast.clear();console.log(err)});
  517. },
  518. getLeaveList(){
  519. let parameter = {
  520. pageIndex: 1,
  521. pageSize: 999,
  522. // status: '',
  523. // startDate: '',
  524. // endDate: '',
  525. // ownerId: '',
  526. // leaveType: ''
  527. }
  528. this.$axios.post("/business-trip/list", parameter)
  529. .then(res => {
  530. if(res.code == "ok") {
  531. this.leaveList = res.data.records
  532. } else {
  533. this.$toast.fail('获取失败:'+res.smg);
  534. }
  535. }).catch(err=> {this.$toast.clear();console.log(err)});
  536. },
  537. getAuditList(){
  538. this.$axios.post("/business-trip/auditList", {
  539. pageSize: 999,
  540. pageIndex: 1
  541. }).then(res => {
  542. if(res.code == "ok") {
  543. this.auditList = res.data.records
  544. for(let i in this.auditList){
  545. this.$set(this.auditList[i],'approveLoading',false)
  546. }
  547. } else {
  548. this.$toast.fail('获取失败');
  549. }
  550. }).catch(err=> {this.$toast.clear();console.log(err)});
  551. }
  552. },
  553. }
  554. </script>
  555. <style lang="less" scoped>
  556. .content{
  557. margin-top: 46px;
  558. overflow: auto;
  559. .edit{
  560. .userCheckbox {
  561. padding: 10px;
  562. }
  563. padding-bottom: 46px;
  564. .form_btn{
  565. z-index: 1000;
  566. }
  567. }
  568. .list{
  569. .list_collapse>div{
  570. margin: 4px;
  571. }
  572. .list_collapse{
  573. .collapse_label_l{
  574. width: 50%;
  575. padding: 4px;
  576. display: inline-block;
  577. }
  578. .collapse_label_r{
  579. width: 50%;
  580. padding: 4px;
  581. display: inline-block;
  582. .waiting {
  583. color:orange;
  584. }
  585. .rejected {
  586. color:red;
  587. }
  588. }
  589. .wrapper{
  590. div{
  591. margin: 8px 16px;
  592. zoom: 1;
  593. }
  594. div:after{
  595. content: "";
  596. display: block;
  597. height: 0;
  598. clear: both;
  599. visibility: hidden;
  600. }
  601. div span:nth-child(1){
  602. width: 40%;
  603. float: left;
  604. }
  605. div span:nth-child(2){
  606. width: 60%;
  607. float: left;
  608. }
  609. }
  610. .operation{
  611. display: flex;
  612. align-items: center;
  613. justify-content: flex-end;
  614. }
  615. }
  616. }
  617. .audit{
  618. .list_collapse>div{
  619. margin: 4px;
  620. }
  621. .list_collapse{
  622. .collapse_label_l{
  623. width: 50%;
  624. padding: 4px;
  625. display: inline-block;
  626. }
  627. .collapse_label_r{
  628. width: 50%;
  629. padding: 4px;
  630. display: inline-block;
  631. .waiting {
  632. color:orange;
  633. }
  634. .rejected {
  635. color:red;
  636. }
  637. }
  638. .operation{
  639. margin-top: 5px;
  640. padding-top: 5px;
  641. border-top: 0.5px solid #ebedf0;
  642. display: flex;
  643. align-items: center;
  644. justify-content: flex-end;
  645. button{
  646. width: 1.2rem;
  647. }
  648. }
  649. .wrapper{
  650. div{
  651. margin: 8px 16px;
  652. zoom: 1;
  653. }
  654. div:after{
  655. content: "";
  656. display: block;
  657. height: 0;
  658. clear: both;
  659. visibility: hidden;
  660. }
  661. div span:nth-child(1){
  662. width: 40%;
  663. float: left;
  664. }
  665. div span:nth-child(2){
  666. width: 60%;
  667. float: left;
  668. }
  669. }
  670. .lookup{
  671. display: flex;
  672. align-items: center;
  673. justify-content: flex-end;
  674. }
  675. }
  676. }
  677. }
  678. </style>
  679. <style>
  680. .edit_form .invoice .van-field__label{
  681. color: #999;
  682. }
  683. .edit_form .invoice .van-field__control{
  684. color: #999;
  685. }
  686. </style>