list.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. <template>
  2. <div class='order-list'>
  3. <van-sticky :offset-top="offsetTop">
  4. <div class="top-banner fs-14 kitbox ">
  5. <div class="box-flex-1">
  6. <form action="/">
  7. <van-search
  8. v-model="searchText"
  9. placeholder="姓名、处方号、医保卡号、开方医生"
  10. @search="onSearch"
  11. shape="round"
  12. >
  13. <!-- <div v-if="type!='pending'" slot="action" class="plr5 search-action">
  14. <div class="sort-panel" @click.stop="onSort">
  15. <div>时间</div>
  16. <div>
  17. <img v-show="sortAsc===true" src="@/assets/images/z-paixu.png" alt="">
  18. <img v-show="sortAsc===false" src="@/assets/images/z-paixu1.png" alt="">
  19. </div>
  20. </div>
  21. <van-icon @click="filterShow=true" style="vertical-align: text-bottom;" color="#17b3ec" size="20px" name="filter-o" />
  22. </div> -->
  23. </van-search>
  24. </form>
  25. </div>
  26. <div>
  27. <div v-if="type!='pending'" slot="action" class="pr15 search-action">
  28. <div class="sort-panel" @click.stop="onSort">
  29. <div>时间</div>
  30. <div>
  31. <img v-show="sortAsc===true" src="@/assets/images/z-paixu.png" alt="">
  32. <img v-show="sortAsc===false" src="@/assets/images/z-paixu1.png" alt="">
  33. </div>
  34. </div>
  35. <van-icon @click="filterShow=true" style="vertical-align: text-bottom;" color="#17b3ec" size="20px" name="filter-o" />
  36. </div>
  37. </div>
  38. <!-- <div @click="drowMenuShow=false" class="kitbox pl15 search-date ptb10">
  39. <div @click="pickDate(1)" class="date-item">{{$moment(startDate).format('YYYY-MM-DD')}}</div>
  40. <div class="ptb5 plr10">至</div>
  41. <div @click="pickDate(2)" class="date-item">{{$moment(endDate).format('YYYY-MM-DD')}}</div>
  42. <div class="pl15 box-flex-1 tr pr15">
  43. <van-button @click="onSearch" type="info" size="mini">搜索</van-button>
  44. </div>
  45. </div>
  46. <div class="drop-menu" :class="{active: drowMenuShow}">
  47. <div class="drop-menu-title tc fs-14" @click="drowMenuShow=!drowMenuShow">
  48. <span class="v-middle">{{selcommunity? selcommunity.hospitalName : '全部社区'}}</span>
  49. <van-icon class="v-middle ml5" name="play" />
  50. </div>
  51. <div class="drop-menu-area kitbox">
  52. <div class="drop-menu-area-left" v-if="townList&&townList.length">
  53. <van-sidebar v-model="activeKey">
  54. <van-sidebar-item v-for="(item, i) in townList" :key="i" :title="item.townName" />
  55. </van-sidebar>
  56. </div>
  57. <div class="drop-menu-area-right">
  58. <div v-for="(item, i) in communityList" :key="i" @click="selcommunity=item;drowMenuShow=false;onSearch()">{{item.hospitalName}}</div>
  59. </div>
  60. </div>
  61. </div> -->
  62. </div>
  63. </van-sticky>
  64. <!-- searchPlaceholder="订单号、金额、手机号" -->
  65. <CustomList
  66. ref="customList"
  67. :searchfun="false"
  68. @onLoad="onLoad">
  69. <div class="list plr15">
  70. <div @click="gotoUrl('/order/detail', {id: item.id})" v-for="(item, i) in list" :key="i" class="item plr15 c-333 fs-14">
  71. <div class="kitbox ptb10 bb-e1e1e1">
  72. <div class="box-flex-1 fs-14">{{item.name}} {{ item.socialSecurityCardNum }}</div>
  73. <div v-if="item.sellState==1" class="c-17b3ec">{{item.sellStateName}}</div>
  74. <div v-else class="" >{{item.sellStateName}}</div>
  75. <!-- <div>-<span class="c-17b3ec" v-if="item.reviewerState==1">审核通过</span><span class="c-ff5e6c" v-else-if="item.reviewerState==-1">审核不通过</span><span class="c-ff5e6c" v-else-if="item.reviewerState==-2">取消审方</span><span v-else>未审方</span></div> -->
  76. </div>
  77. <div class="lh20 ptb10">
  78. <div>处方号:{{item.prescribeNum}}</div>
  79. <div>开方医生:{{item.doctorName}}</div>
  80. <div>来源机构:{{item.community}}</div>
  81. <div>订单类型:{{item.orderSource=='厦门i健康'? '线上订单' : "线下订单"}}</div>
  82. <div>开方时间:{{item.orderSource=='厦门i健康'? formatDatetime(item.prescribeTime) : formatDate(item.prescribeTime)}}</div>
  83. <div>取药码:{{item.pickUpNum}}</div>
  84. </div>
  85. <div class="ptb10 bt-e1e1e1 kitbox" v-if="item.amount">
  86. <div class="box-flex-1 lh24"><span v-if="item.amount">¥{{item.amount}}</span></div>
  87. <!-- <div v-if="item.reviewerState==1 || item.reviewerState==-1"><van-button @click.stop="reviewerOrder(item)" size="mini" color="#17b3ec" type="primary">取消审方</van-button></div> -->
  88. </div>
  89. </div>
  90. </div>
  91. </CustomList>
  92. <FilterPanel v-if="type!='pending'" v-model="filterShow" :extendList="extendList" @onSubmit="onSubmit" ref="Filter"/>
  93. <!-- <van-popup v-model="filterShow" position="right">
  94. <div class="fs-14 c-333 plr15 filter-panel">
  95. <div class="ptb10">按社区</div>
  96. <div class="ptb10">按时间</div>
  97. <div class="">
  98. <van-tag type="primary" round>全部</van-tag>
  99. <van-tag type="primary" round>标签</van-tag>
  100. <van-tag type="primary" round>标签</van-tag>
  101. <van-tag type="primary" round>标签</van-tag>
  102. </div>
  103. <div class="ptb10">按类型</div>
  104. <div class="">
  105. <van-tag type="primary" round>全部</van-tag>
  106. <van-tag type="primary" round>标签</van-tag>
  107. <van-tag type="primary" round>标签</van-tag>
  108. </div>
  109. </div>
  110. </van-popup> -->
  111. <van-popup v-model="datePickerShow" position="bottom" >
  112. <van-datetime-picker
  113. v-model="currentDate"
  114. @confirm="onPick"
  115. @cancel="datePickerShow=false"
  116. type="date"
  117. title=""
  118. :max-date="maxDate"
  119. />
  120. </van-popup>
  121. <div class="bot-banner ptb10 bgc-fff">
  122. <div class="kitbox fs-14">
  123. <div class="pr40 box-v-middle pl15">
  124. 共 {{totalCount}} 笔订单
  125. </div>
  126. <!-- <div class="box-flex-1 plr15 tr">
  127. 药品总金额 ¥{{totalMoney}}
  128. </div> -->
  129. </div>
  130. </div>
  131. </div>
  132. </template>
  133. <script>
  134. import FilterPanel from './components/Filter'
  135. import medicineAbinetApi from '@/api/api-medicineAbinet'
  136. import { findOneUser} from "@/api/login";
  137. export default{
  138. name: 'orderList',
  139. props: ['type'],
  140. components:{
  141. FilterPanel
  142. },
  143. data(){
  144. return {
  145. filterShow: false,
  146. searchText: '',
  147. list: [],
  148. currentDate: new Date(),
  149. maxDate: new Date(),
  150. datePickerShow: false,
  151. startDate: this.$moment().subtract(30, 'days'),
  152. endDate: new Date(),
  153. pickType: 1,
  154. totalCount: 0,
  155. totalMoney: 0,
  156. activeKey: 0,
  157. value1: '',
  158. defaultOption: [
  159. { townName: '全部', townCode: "", children: [{hospitalCode: '', hospitalName: '全部'}] },
  160. ],
  161. drowMenuShow: false,
  162. townList: [],
  163. communityList: [],
  164. selcommunity: '',
  165. sellState: '',
  166. extendList: [{
  167. name: "按审方状态",
  168. value: this.type == 'pending'? 0 : '',
  169. opts: [
  170. {name: '全部', value: ""},
  171. {name: '未审方', value: 0},
  172. {name: '审方通过', value: 1},
  173. {name: '审方不通过', value: -1},
  174. // {name: '取消审方', value: -2},
  175. ],
  176. }],
  177. sortAsc: false
  178. }
  179. },
  180. watch: {
  181. activeKey(n){
  182. this.loadChildren()
  183. }
  184. },
  185. created() {
  186. if(this.type == 'pending'){
  187. this.startDate = this.$moment("2000-01-01")
  188. }
  189. },
  190. mounted(){
  191. var allTime = false
  192. if(this.$route.query.hospital||this.$route.query.town){
  193. this.selcommunity = {
  194. hospitalCode: this.$route.query.hospital||'',
  195. hospitalName: this.$route.query.hospitalName||'',
  196. town: this.$route.query.town||'',
  197. townName: this.$route.query.townName||'',
  198. }
  199. }
  200. if(this.$route.query.sellState!==''&&this.$route.query.sellState!==undefined){
  201. this.sellState = this.$route.query.sellState
  202. allTime = true
  203. }
  204. if(this.type != 'pending'){
  205. this.$refs.Filter.submit(this.selcommunity, this.sellState, allTime)
  206. }
  207. },
  208. methods:{
  209. $refreshData(){
  210. this.$refs.customList.refresh(true)
  211. },
  212. onLoad({page, pageSize, searchText}){
  213. var { startDate, endDate } = this
  214. var p
  215. if(this.searchText){
  216. p = {
  217. userId: this.user.id,
  218. content: this.searchText,
  219. timeSort: this.sortAsc? 1 : 2,
  220. page: page,
  221. size: pageSize
  222. }
  223. } else {
  224. var town = '', community = ''
  225. if(this.selcommunity){
  226. community = this.selcommunity.hospitalCode||this.selcommunity.hospital||''
  227. town = community? '' : (this.selcommunity.town||'')
  228. }
  229. p = {
  230. startTime: startDate? this.$moment(startDate).format('YYYY-MM-DD 00:00:00') : '',
  231. endTime: endDate? this.$moment(endDate).format('YYYY-MM-DD 23:59:59') : '',
  232. userId: this.user.id,
  233. community,
  234. sellState: this.sellState,
  235. reviewerState: this.extendList[0].value,
  236. town,
  237. page: page,
  238. size: pageSize,
  239. timeSort: this.sortAsc? 1 : -1,
  240. }
  241. }
  242. medicineAbinetApi
  243. .orderList(p)
  244. .then(res=>{
  245. if(res.status == 200){
  246. this.totalCount = res.totalCount
  247. var list = res.detailModelList
  248. this.list = page==1? list : this.list.concat(list)
  249. this.$refs.customList.endLoad(!res.detailModelList || res.detailModelList.length==0, this.list.length)
  250. } else {
  251. this.onLoadError()
  252. }
  253. }).catch(err=>{
  254. console.error(err)
  255. this.onLoadError()
  256. })
  257. },
  258. onLoadError(){
  259. this.list = []
  260. this.totalCount = 0
  261. this.$refs.customList.endLoad(false, true)
  262. },
  263. pickDate(pickType){
  264. this.pickType = pickType
  265. this.currentDate = pickType ==1? this.startDate : this.endDate
  266. this.datePickerShow = true
  267. },
  268. onPick(){
  269. var date = this.$moment(this.currentDate).toDate()
  270. if(this.pickType ==1){
  271. this.startDate = date
  272. } else {
  273. this.endDate = date
  274. }
  275. this.datePickerShow = false
  276. },
  277. onSearch(){
  278. this.list = []
  279. this.$refs.customList.refresh(true)
  280. },
  281. getOrgList(){
  282. findOneUser({
  283. id: this.user.id
  284. }).then(async res => {
  285. // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ; "replenisher": "补货员"
  286. var role = this.user.curRoleCode
  287. var userArea = res.obj.userArea
  288. var townList = [].concat(this.defaultOption)
  289. if(role=='communityAdmin' || role=="replenisher"){
  290. var g = _.groupBy(userArea, 'town')
  291. for(var k in g){
  292. var tmp = g[k][0].concat([])
  293. tmp.children = g[k]
  294. townList.push(tmp)
  295. }
  296. this.townList = townList
  297. } else {
  298. if(role == 'regionAdmin'){
  299. userArea.forEach(v => {
  300. v.children = []
  301. });
  302. this.townList = townList.concat(userArea)
  303. } else if(role=='saasAdmin'){
  304. await medicineAbinetApi
  305. .baseTownList({ filters: "city=350200"})//写死厦门市
  306. .then(res => {
  307. if (res.status == 200) {
  308. var detailModelList = res.detailModelList;
  309. detailModelList.forEach((item) => {
  310. item.town = item.code
  311. item.townName = item.name
  312. item.children = [];
  313. });
  314. this.townList = townList.concat(detailModelList)
  315. }
  316. });
  317. }
  318. }
  319. this.loadChildren()
  320. });
  321. },
  322. async loadChildren(){
  323. var item = this.townList[this.activeKey]
  324. if(!item.children || !item.children.length){
  325. await medicineAbinetApi
  326. .findOrgList({ code: item.town, paeg: 1, pageSize: 999 })
  327. .then(res => {
  328. if (res.status == 200) {
  329. res.detailModelList.forEach(v=>{
  330. v.hospitalName = v.name
  331. v.hospitalCode = v.code
  332. })
  333. item.children = res.detailModelList
  334. }
  335. })
  336. .catch(err=>{
  337. item.children = []
  338. })
  339. }
  340. this.communityList = item.children
  341. },
  342. onSubmit(data){
  343. this.startDate = data.startTime
  344. this.endDate = data.endTime
  345. this.selcommunity = data.selcommunity
  346. this.sellState = data.sellState
  347. this.onSearch()
  348. },
  349. reviewerOrder(item){
  350. new Promise((resolve, reject)=>{
  351. this.$dialog.confirm({
  352. title: '提示',
  353. message: '确定取消审核?',
  354. })
  355. .then(() => {
  356. resolve()
  357. })
  358. .catch(() => {
  359. reject()
  360. });
  361. }).then(res=>{
  362. this.$loading('加载中..')
  363. let p = {
  364. orderId: item.id,
  365. reviewerState: -2,
  366. reviewerContent: '',
  367. doctor: this.user.id
  368. }
  369. medicineAbinetApi
  370. .reviewerOrder(p)
  371. .then(res=>{
  372. if(res.status == 200){
  373. this.$toast("操作成功")
  374. item.reviewerState = -2
  375. }
  376. })
  377. .catch(err=>{
  378. console.error(err)
  379. })
  380. }).catch(err=>{
  381. console.error(err)
  382. })
  383. },
  384. onSort(){
  385. this.sortAsc = !this.sortAsc
  386. this.$refs.customList.refresh(true)
  387. }
  388. },
  389. }
  390. </script>
  391. <style lang='scss' scoped>
  392. .order-list{
  393. .custom-list{
  394. height: calc(100vh - 50px);
  395. }
  396. .top-banner{
  397. .search-date{
  398. background: #f2f3f5;
  399. }
  400. .date-item{
  401. width: 110px;
  402. text-align: center;
  403. padding: 5px 0;
  404. border: 1px solid #ccc;
  405. background: #fff;
  406. color: #333;
  407. border-radius: 30px;
  408. }
  409. .van-button--mini{
  410. height: 28px;
  411. width: 60px;
  412. }
  413. .drop-menu{
  414. position: relative;
  415. .van-sidebar-item--select::before{
  416. background-color: #17b3ec;
  417. }
  418. .drop-menu-title{
  419. padding: 10px 0;
  420. background: #fff;
  421. .van-icon{
  422. transform: rotate(90deg);
  423. }
  424. }
  425. .drop-menu-area{
  426. position: absolute;
  427. width: 100%;
  428. left: 0;
  429. display: none;
  430. border-top: 1px solid #e1e1e1;
  431. height: calc(100% - 39px);
  432. .drop-menu-area-right{
  433. height: 100%;
  434. overflow-y: auto;
  435. background: #fff;
  436. -webkit-box-flex: 1;
  437. >div{
  438. padding: 10px 15px;
  439. border-bottom: 1px solid #e1e1e1;
  440. &:last-child{
  441. border-bottom: 0;
  442. }
  443. }
  444. }
  445. }
  446. &.active{
  447. background: rgba($color: #000000, $alpha: .4);
  448. height: calc(100vh - 49px);
  449. .drop-menu-area{
  450. display: -webkit-box;
  451. }
  452. .drop-menu-title{
  453. color: #17b3ec;
  454. .van-icon{
  455. transform: rotate(-90deg);
  456. }
  457. }
  458. }
  459. }
  460. .search-action{
  461. display: -webkit-box;
  462. -webkit-box-align: center;
  463. -webkit-box-pack: center;
  464. background: #fff;
  465. height: 54px;
  466. .sort-panel{
  467. font-size: 16px;
  468. display: -webkit-box;
  469. -webkit-box-align: center;
  470. margin-right: 20px;
  471. img{
  472. display: block;
  473. width: 10px;
  474. height: 10px;
  475. margin-left: 7px;
  476. }
  477. }
  478. }
  479. // ::v-deep .van-dropdown-menu__bar{
  480. // position: absolute;
  481. // bottom: -10px;
  482. // .van-dropdown-menu__item{
  483. // display: none;
  484. // }
  485. // }
  486. }
  487. .list{
  488. .item{
  489. border: 1px solid #e1e1e1;
  490. background: #fff;
  491. margin-top: 10px;
  492. // margin-bottom: 10px;
  493. // &:last-child{
  494. // margin-bottom: 0;
  495. // }
  496. }
  497. }
  498. .bot-banner{
  499. position: fixed;
  500. bottom: 0;
  501. left: 0;
  502. width: 100%;
  503. box-shadow: 0 0 5px #ccc;
  504. }
  505. ::v-deep .van-list__placeholder{
  506. height: 40px;
  507. }
  508. .filter-panel{
  509. background: #fff;
  510. width: 90vw;
  511. height: 100vh;
  512. .van-tag{
  513. width: 95px;
  514. text-align: center;
  515. background: rgb(242, 242, 242);
  516. color: #999;
  517. padding: 5px 0;
  518. justify-content: center;
  519. margin-bottom: 10px;
  520. margin-right: 10px;
  521. &:nth-child(3n){
  522. margin-right: 0;
  523. }
  524. &.active{
  525. background: #17b3ec;
  526. color: #fff;
  527. }
  528. }
  529. }
  530. }
  531. </style>
  532. <style lang="scss">
  533. .mainNobotHasTop{
  534. .order-list{
  535. .custom-list {
  536. height: calc(100vh - 176px);
  537. .search{
  538. top: 96px;
  539. }
  540. }
  541. .top-banner{
  542. .drop-menu{
  543. &.active{
  544. height: calc(100vh - 95px);
  545. }
  546. }
  547. }
  548. }
  549. }
  550. </style>