uni-steps.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <template>
  2. <view class="uni-steps">
  3. <view :class="[direction==='column'?'uni-steps__column':'uni-steps__row']">
  4. <view :class="[direction==='column'?'uni-steps__column-container':'uni-steps__row-container']">
  5. <view :class="[direction==='column'?'uni-steps__column-line-item':'uni-steps__row-line-item']"
  6. v-for="(item,index) in options" :key="index" @click="toStep(item, index)">
  7. <view
  8. :class="[direction==='column'?'uni-steps__column-line':'uni-steps__row-line',direction==='column'?'uni-steps__column-line--before':'uni-steps__row-line--before']"
  9. :style="{backgroundColor:index<=active&&index!==0?activeColor:index===0?'transparent':deactiveColor}">
  10. </view>
  11. <view :class="[direction==='column'?'uni-steps__column-check':'uni-steps__row-check']"
  12. v-if="index === active">
  13. <view class="uni-steps__row-circle activeRound"
  14. :class="[ taskId == item.taskId ?'circleActive': 'activeRound']">{{index + 1}}</view>
  15. </view>
  16. <view
  17. :class="[direction=='column'?'uni-steps__column-circle': taskId == item.taskId ?'circleActive' :'uni-steps__row-circle']"
  18. v-else>
  19. {{index + 1}}
  20. </view>
  21. <view
  22. :class="[direction==='column'?'uni-steps__column-line':'uni-steps__row-line',direction==='column'?'uni-steps__column-line--after':'uni-steps__row-line--after']"
  23. :style="{backgroundColor:index<active&&index!==options.length-1?activeColor:index===options.length-1?'transparent':deactiveColor}">
  24. </view>
  25. </view>
  26. </view>
  27. <view :class="[direction==='column'?'uni-steps__column-text-container':'uni-steps__row-text-container']"
  28. style="margin-top:10upx;">
  29. <view v-for="(item,index) in options" :key="index"
  30. :class="[direction==='column'?'uni-steps__column-text':'uni-steps__row-text']">
  31. <view :style="{color:index<=active?activeColor:deactiveColor}"
  32. :class="[direction==='column'?'uni-steps__column-title':'uni-steps__row-title']">{{item.taskTypeName}} </view>
  33. <text :style="{color:index<=active?activeColor:deactiveColor}" v-if="clientEnvironmentId == 3"
  34. :class="[direction==='column'?'uni-steps__column-desc':'uni-steps__row-desc']">[投:{{item.feedExistNum || 0}}报:{{item.reportExistNum || 0}}]</text>
  35. </view>
  36. </view>
  37. </view>
  38. </view>
  39. </template>
  40. <script>
  41. export default {
  42. name: 'UniSteps',
  43. components: {
  44. },
  45. props: {
  46. direction: {
  47. // 排列方向 row column
  48. type: String,
  49. default: 'row'
  50. },
  51. activeColor: {
  52. // 激活状态颜色
  53. type: String,
  54. default: '#157A2C'
  55. },
  56. deactiveColor: {
  57. // 未激活状态颜色
  58. type: String,
  59. default: '#999999'
  60. },
  61. active: {
  62. // 当前步骤
  63. type: Number,
  64. default: 0
  65. },
  66. options: {
  67. type: Array,
  68. default () {
  69. return []
  70. }
  71. } // 数据
  72. },
  73. data() {
  74. return {
  75. taskId: null,
  76. clientEnvironmentId: uni.getStorageSync("userInfo") && uni.getStorageSync("userInfo").clientEnvironmentId,
  77. }
  78. },
  79. methods: {
  80. toStep(item, index) {
  81. if (item.taskId == -2) {
  82. uni.showToast({
  83. title: "工序已到完结状态",
  84. icon: "none",
  85. })
  86. return false
  87. }
  88. if(this.clientEnvironmentId == 3) { // 碳谷
  89. this.taskId = item.taskId
  90. this.$emit('selectStep', item);
  91. } else {
  92. if(item.count > 0 || index == this.active) {
  93. this.taskId = item.taskId
  94. this.$emit('selectStep', item);
  95. } else {
  96. uni.showToast({
  97. title: "还未执行到此工序",
  98. icon: "none",
  99. })
  100. }
  101. }
  102. }
  103. }
  104. }
  105. </script>
  106. <style lang="scss" scoped>
  107. .uni-steps {
  108. /* #ifndef APP-NVUE */
  109. display: flex;
  110. width: 100%;
  111. /* #endif */
  112. /* #ifdef APP-NVUE */
  113. flex: 1;
  114. /* #endif */
  115. flex-direction: column;
  116. margin-top: 10rpx;
  117. }
  118. .uni-steps__row {
  119. /* #ifndef APP-NVUE */
  120. display: flex;
  121. /* #endif */
  122. flex-direction: column;
  123. }
  124. .uni-steps__column {
  125. /* #ifndef APP-NVUE */
  126. display: flex;
  127. /* #endif */
  128. flex-direction: row-reverse;
  129. }
  130. .uni-steps__row-text-container {
  131. /* #ifndef APP-NVUE */
  132. display: flex;
  133. /* #endif */
  134. flex-direction: row;
  135. }
  136. .uni-steps__column-text-container {
  137. /* #ifndef APP-NVUE */
  138. display: flex;
  139. /* #endif */
  140. flex-direction: column;
  141. flex: 1;
  142. }
  143. .uni-steps__row-text {
  144. /* #ifndef APP-NVUE */
  145. display: inline-flex;
  146. /* #endif */
  147. flex: 1;
  148. flex-direction: column;
  149. }
  150. .uni-steps__column-text {
  151. padding: 12upx 0upx;
  152. border-bottom-style: solid;
  153. border-bottom-width: 2upx;
  154. border-bottom-color: $uni-border-color;
  155. /* #ifndef APP-NVUE */
  156. display: flex;
  157. /* #endif */
  158. flex-direction: column;
  159. }
  160. .uni-steps__row-title {
  161. font-size: 28rpx;
  162. line-height: 40upx;
  163. text-align: center;
  164. min-width: 200rpx;
  165. }
  166. .uni-steps__column-title {
  167. font-size: 28rpx;
  168. text-align: left;
  169. line-height: 40upx;
  170. }
  171. .uni-steps__row-desc {
  172. font-size: 24upx;
  173. line-height: 28upx;
  174. text-align: center;
  175. }
  176. .uni-steps__column-desc {
  177. font-size: $uni-font-size-sm;
  178. text-align: left;
  179. line-height: 36upx;
  180. }
  181. .uni-steps__row-container {
  182. height: 60upx;
  183. border: 1px soild red;
  184. /* #ifndef APP-NVUE */
  185. display: flex;
  186. /* #endif */
  187. flex-direction: row;
  188. }
  189. .uni-steps__column-container {
  190. /* #ifndef APP-NVUE */
  191. display: inline-flex;
  192. /* #endif */
  193. width: 60upx;
  194. flex-direction: column;
  195. }
  196. .uni-steps__row-line-item {
  197. /* #ifndef APP-NVUE */
  198. display: inline-flex;
  199. /* #endif */
  200. flex-direction: row;
  201. flex: 1;
  202. height: 60upx;
  203. line-height: 60upx;
  204. align-items: center;
  205. justify-content: center;
  206. min-width: 200rpx;
  207. }
  208. .uni-steps__column-line-item {
  209. /* #ifndef APP-NVUE */
  210. display: flex;
  211. /* #endif */
  212. flex-direction: column;
  213. flex: 1;
  214. align-items: center;
  215. justify-content: center;
  216. }
  217. .uni-steps__row-line {
  218. flex: 1;
  219. height: 2upx;
  220. background-color: $uni-text-color-grey;
  221. }
  222. .uni-steps__column-line {
  223. width: 2upx;
  224. background-color: $uni-text-color-grey;
  225. }
  226. .uni-steps__row-line--after {
  227. transform: translateX(1px);
  228. }
  229. .uni-steps__column-line--after {
  230. flex: 1;
  231. transform: translate(0px, 1px);
  232. }
  233. .uni-steps__row-line--before {
  234. transform: translateX(-1px);
  235. }
  236. .uni-steps__column-line--before {
  237. height: 12upx;
  238. transform: translate(0px, -1px);
  239. }
  240. .uni-steps__row-circle {
  241. border: 1px solid #999999;
  242. background: transparent;
  243. width: 50upx;
  244. height: 50upx;
  245. border-radius: 50%;
  246. text-align: center;
  247. line-height: 50upx;
  248. }
  249. .uni-steps__column-circle {
  250. width: 10upx;
  251. height: 10upx;
  252. border-radius: 200upx;
  253. background-color: $uni-text-color-grey;
  254. margin: 8upx 0upx 10upx 0upx;
  255. }
  256. .uni-steps__row-check {
  257. margin: 0upx 12upx;
  258. }
  259. .uni-steps__column-check {
  260. height: 28upx;
  261. line-height: 28upx;
  262. margin: 4upx 0upx;
  263. }
  264. .activeRound {
  265. background: $theme-color;
  266. color: #fff;
  267. }
  268. .circleActive {
  269. border: 1px solid #FFA929;
  270. background: #FFA929;
  271. width: 50upx;
  272. height: 50upx;
  273. border-radius: 50%;
  274. text-align: center;
  275. line-height: 50upx;
  276. color: #fff;
  277. }
  278. </style>