ソースを参照

多图片上传

panxingxin 5 年 前
コミット
ec27d6bb6f
92 ファイル変更367 行追加158 行削除
  1. 0 1
      .gitignore
  2. 7 2
      config.xml
  3. 34 7
      package-lock.json
  4. 1 1
      package.json
  5. 8 0
      resources/README.md
  6. BIN
      resources/android/icon/drawable-hdpi-icon.png
  7. BIN
      resources/android/icon/drawable-ldpi-icon.png
  8. BIN
      resources/android/icon/drawable-mdpi-icon.png
  9. BIN
      resources/android/icon/drawable-xhdpi-icon.png
  10. BIN
      resources/android/icon/drawable-xxhdpi-icon.png
  11. BIN
      resources/android/icon/drawable-xxxhdpi-icon.png
  12. BIN
      resources/android/splash/drawable-land-hdpi-screen.png
  13. BIN
      resources/android/splash/drawable-land-ldpi-screen.png
  14. BIN
      resources/android/splash/drawable-land-mdpi-screen.png
  15. BIN
      resources/android/splash/drawable-land-xhdpi-screen.png
  16. BIN
      resources/android/splash/drawable-land-xxhdpi-screen.png
  17. BIN
      resources/android/splash/drawable-land-xxxhdpi-screen.png
  18. BIN
      resources/android/splash/drawable-port-hdpi-screen.png
  19. BIN
      resources/android/splash/drawable-port-ldpi-screen.png
  20. BIN
      resources/android/splash/drawable-port-mdpi-screen.png
  21. BIN
      resources/android/splash/drawable-port-xhdpi-screen.png
  22. BIN
      resources/android/splash/drawable-port-xxhdpi-screen.png
  23. BIN
      resources/android/splash/drawable-port-xxxhdpi-screen.png
  24. BIN
      resources/icon.png
  25. BIN
      resources/icon_initial.png
  26. BIN
      resources/ios/icon/icon-1024.png
  27. BIN
      resources/ios/icon/icon-108@2x.png
  28. BIN
      resources/ios/icon/icon-20.png
  29. BIN
      resources/ios/icon/icon-20@2x.png
  30. BIN
      resources/ios/icon/icon-20@3x.png
  31. BIN
      resources/ios/icon/icon-24@2x.png
  32. BIN
      resources/ios/icon/icon-27.5@2x.png
  33. BIN
      resources/ios/icon/icon-29.png
  34. BIN
      resources/ios/icon/icon-29@2x.png
  35. BIN
      resources/ios/icon/icon-29@3x.png
  36. BIN
      resources/ios/icon/icon-40.png
  37. BIN
      resources/ios/icon/icon-40@2x.png
  38. BIN
      resources/ios/icon/icon-40@3x.png
  39. BIN
      resources/ios/icon/icon-44@2x.png
  40. BIN
      resources/ios/icon/icon-50.png
  41. BIN
      resources/ios/icon/icon-50@2x.png
  42. BIN
      resources/ios/icon/icon-60.png
  43. BIN
      resources/ios/icon/icon-60@2x.png
  44. BIN
      resources/ios/icon/icon-60@3x.png
  45. BIN
      resources/ios/icon/icon-72.png
  46. BIN
      resources/ios/icon/icon-72@2x.png
  47. BIN
      resources/ios/icon/icon-76.png
  48. BIN
      resources/ios/icon/icon-76@2x.png
  49. BIN
      resources/ios/icon/icon-83.5@2x.png
  50. BIN
      resources/ios/icon/icon-86@2x.png
  51. BIN
      resources/ios/icon/icon-98@2x.png
  52. BIN
      resources/ios/icon/icon-small.png
  53. BIN
      resources/ios/icon/icon-small@2x.png
  54. BIN
      resources/ios/icon/icon-small@3x.png
  55. BIN
      resources/ios/icon/icon.png
  56. BIN
      resources/ios/icon/icon@2x.png
  57. BIN
      resources/ios/splash/Default-1792h~iphone.png
  58. BIN
      resources/ios/splash/Default-2436h.png
  59. BIN
      resources/ios/splash/Default-2688h~iphone.png
  60. BIN
      resources/ios/splash/Default-568h@2x~iphone.png
  61. BIN
      resources/ios/splash/Default-667h.png
  62. BIN
      resources/ios/splash/Default-736h.png
  63. BIN
      resources/ios/splash/Default-Landscape-1792h~iphone.png
  64. BIN
      resources/ios/splash/Default-Landscape-2436h.png
  65. BIN
      resources/ios/splash/Default-Landscape-2688h~iphone.png
  66. BIN
      resources/ios/splash/Default-Landscape-736h.png
  67. BIN
      resources/ios/splash/Default-Landscape@2x~ipad.png
  68. BIN
      resources/ios/splash/Default-Landscape@~ipadpro.png
  69. BIN
      resources/ios/splash/Default-Landscape~ipad.png
  70. BIN
      resources/ios/splash/Default-Portrait@2x~ipad.png
  71. BIN
      resources/ios/splash/Default-Portrait@~ipadpro.png
  72. BIN
      resources/ios/splash/Default-Portrait~ipad.png
  73. BIN
      resources/ios/splash/Default@2x~iphone.png
  74. BIN
      resources/ios/splash/Default@2x~universal~anyany.png
  75. BIN
      resources/ios/splash/Default~iphone.png
  76. BIN
      resources/splash.png
  77. 2 0
      src/app/app.component.html
  78. 13 6
      src/app/app.component.ts
  79. 15 13
      src/app/contract-detail/contract-detail.page.html
  80. 30 12
      src/app/contract-detail/contract-detail.page.ts
  81. 4 6
      src/app/sample-detail/sample-detail.page.html
  82. 43 24
      src/app/sample-detail/sample-detail.page.ts
  83. 6 6
      src/app/sample-table/sample-table.page.html
  84. 7 6
      src/app/store-qc-detail/store-qc-detail.page.html
  85. 27 14
      src/app/store-qc-detail/store-qc-detail.page.ts
  86. 7 6
      src/app/store-qc-scanning/store-qc-scanning.page.html
  87. 28 12
      src/app/store-qc-scanning/store-qc-scanning.page.ts
  88. 2 1
      src/environments/environment.prod.ts
  89. 2 1
      src/environments/environment.ts
  90. 36 8
      src/providers/common.service.ts
  91. 1 1
      src/providers/update.ts
  92. 94 31
      src/providers/user-data.ts

+ 0 - 1
.gitignore

@@ -21,7 +21,6 @@ npm-debug.log*
 coverage/
 www/
 node_modules/
-resources/
 platforms/
 tmp/
 temp/

+ 7 - 2
config.xml

@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='utf-8'?>
-<widget id="io.ionic.starter" version="1.0.7" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
-    <name>SG扫描</name>
+<widget id="com.ionicframework.sgZongLi" version="1.0.7" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+    <name>SG综礼</name>
     <description>An awesome Ionic/Cordova app.</description>
     <author email="hi@ionicframework.com" href="http://ionicframework.com/">Ionic Framework Team</author>
     <content src="index.html" />
@@ -88,6 +88,11 @@
         <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
         <splash height="2436" src="resources/ios/splash/Default-2436h.png" width="1125" />
         <splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
+        <icon height="216" src="resources/ios/icon/icon-108@2x.png" width="216" />
+        <splash height="2688" src="resources/ios/splash/Default-2688h~iphone.png" width="1242" />
+        <splash height="1242" src="resources/ios/splash/Default-Landscape-2688h~iphone.png" width="2688" />
+        <splash height="1792" src="resources/ios/splash/Default-1792h~iphone.png" width="828" />
+        <splash height="828" src="resources/ios/splash/Default-Landscape-1792h~iphone.png" width="1792" />
     </platform>
     <plugin name="cordova-plugin-whitelist" spec="1.3.3" />
     <plugin name="cordova-plugin-statusbar" spec="2.4.2" />

+ 34 - 7
package-lock.json

@@ -1469,6 +1469,11 @@
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
     },
+    "array-ify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+      "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4="
+    },
     "array-union": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
@@ -2538,6 +2543,15 @@
       "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
       "dev": true
     },
+    "compare-func": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
+      "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
+      "requires": {
+        "array-ify": "^1.0.0",
+        "dot-prop": "^3.0.0"
+      }
+    },
     "compare-versions": {
       "version": "3.5.1",
       "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz",
@@ -2707,16 +2721,16 @@
       }
     },
     "cordova-android": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-8.0.0.tgz",
-      "integrity": "sha512-Ipv8HbVJpxEyYFSFLTEOaLRp0yxBtJVNbgSuDEB4naa34FzQaRWSNiiMcPJnO+x3hRXNt7pcwa46hARNzhn7+w==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-8.1.0.tgz",
+      "integrity": "sha512-eAY6g9q3raJ4P03wNdSWC5MOW1EfxoomWNXsPhi7T6Q9yAqmxqn0sLEUjLL1Ib0LCH3nKQWBXdxapQ5LgbHu+g==",
       "requires": {
-        "android-versions": "^1.3.0",
-        "cordova-common": "^3.1.0",
-        "elementtree": "^0.1.7",
+        "android-versions": "^1.4.0",
+        "compare-func": "^1.3.2",
+        "cordova-common": "^3.2.0",
         "nopt": "^4.0.1",
         "properties-parser": "^0.3.1",
-        "q": "^1.4.1",
+        "q": "^1.5.1",
         "shelljs": "^0.5.3"
       }
     },
@@ -3308,6 +3322,14 @@
       "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
       "dev": true
     },
+    "dot-prop": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+      "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+      "requires": {
+        "is-obj": "^1.0.0"
+      }
+    },
     "duplexify": {
       "version": "3.7.1",
       "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
@@ -5650,6 +5672,11 @@
         }
       }
     },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+    },
     "is-path-cwd": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",

+ 1 - 1
package.json

@@ -47,7 +47,7 @@
     "@ionic/angular": "^4.1.0",
     "@ionic/storage": "^2.2.0",
     "com-sarriaroman-photoviewer": "^1.2.4",
-    "cordova-android": "8.0.0",
+    "cordova-android": "^8.1.0",
     "cordova-browser": "6.0.0",
     "cordova-plugin-advanced-http": "2.0.9",
     "cordova-plugin-app-version": "^0.1.9",

+ 8 - 0
resources/README.md

@@ -0,0 +1,8 @@
+These are Cordova resources. You can replace icon.png and splash.png and run
+`ionic cordova resources` to generate custom icons and splash screens for your
+app. See `ionic cordova resources --help` for details.
+
+Cordova reference documentation:
+
+- Icons: https://cordova.apache.org/docs/en/latest/config_ref/images.html
+- Splash Screens: https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/

BIN
resources/android/icon/drawable-hdpi-icon.png


BIN
resources/android/icon/drawable-ldpi-icon.png


BIN
resources/android/icon/drawable-mdpi-icon.png


BIN
resources/android/icon/drawable-xhdpi-icon.png


BIN
resources/android/icon/drawable-xxhdpi-icon.png


BIN
resources/android/icon/drawable-xxxhdpi-icon.png


BIN
resources/android/splash/drawable-land-hdpi-screen.png


BIN
resources/android/splash/drawable-land-ldpi-screen.png


BIN
resources/android/splash/drawable-land-mdpi-screen.png


BIN
resources/android/splash/drawable-land-xhdpi-screen.png


BIN
resources/android/splash/drawable-land-xxhdpi-screen.png


BIN
resources/android/splash/drawable-land-xxxhdpi-screen.png


BIN
resources/android/splash/drawable-port-hdpi-screen.png


BIN
resources/android/splash/drawable-port-ldpi-screen.png


BIN
resources/android/splash/drawable-port-mdpi-screen.png


BIN
resources/android/splash/drawable-port-xhdpi-screen.png


BIN
resources/android/splash/drawable-port-xxhdpi-screen.png


BIN
resources/android/splash/drawable-port-xxxhdpi-screen.png


BIN
resources/icon.png


BIN
resources/icon_initial.png


BIN
resources/ios/icon/icon-1024.png


BIN
resources/ios/icon/icon-108@2x.png


BIN
resources/ios/icon/icon-20.png


BIN
resources/ios/icon/icon-20@2x.png


BIN
resources/ios/icon/icon-20@3x.png


BIN
resources/ios/icon/icon-24@2x.png


BIN
resources/ios/icon/icon-27.5@2x.png


BIN
resources/ios/icon/icon-29.png


BIN
resources/ios/icon/icon-29@2x.png


BIN
resources/ios/icon/icon-29@3x.png


BIN
resources/ios/icon/icon-40.png


BIN
resources/ios/icon/icon-40@2x.png


BIN
resources/ios/icon/icon-40@3x.png


BIN
resources/ios/icon/icon-44@2x.png


BIN
resources/ios/icon/icon-50.png


BIN
resources/ios/icon/icon-50@2x.png


BIN
resources/ios/icon/icon-60.png


BIN
resources/ios/icon/icon-60@2x.png


BIN
resources/ios/icon/icon-60@3x.png


BIN
resources/ios/icon/icon-72.png


BIN
resources/ios/icon/icon-72@2x.png


BIN
resources/ios/icon/icon-76.png


BIN
resources/ios/icon/icon-76@2x.png


BIN
resources/ios/icon/icon-83.5@2x.png


BIN
resources/ios/icon/icon-86@2x.png


BIN
resources/ios/icon/icon-98@2x.png


BIN
resources/ios/icon/icon-small.png


BIN
resources/ios/icon/icon-small@2x.png


BIN
resources/ios/icon/icon-small@3x.png


BIN
resources/ios/icon/icon.png


BIN
resources/ios/icon/icon@2x.png


BIN
resources/ios/splash/Default-1792h~iphone.png


BIN
resources/ios/splash/Default-2436h.png


BIN
resources/ios/splash/Default-2688h~iphone.png


BIN
resources/ios/splash/Default-568h@2x~iphone.png


BIN
resources/ios/splash/Default-667h.png


BIN
resources/ios/splash/Default-736h.png


BIN
resources/ios/splash/Default-Landscape-1792h~iphone.png


BIN
resources/ios/splash/Default-Landscape-2436h.png


BIN
resources/ios/splash/Default-Landscape-2688h~iphone.png


BIN
resources/ios/splash/Default-Landscape-736h.png


BIN
resources/ios/splash/Default-Landscape@2x~ipad.png


BIN
resources/ios/splash/Default-Landscape@~ipadpro.png


BIN
resources/ios/splash/Default-Landscape~ipad.png


BIN
resources/ios/splash/Default-Portrait@2x~ipad.png


BIN
resources/ios/splash/Default-Portrait@~ipadpro.png


BIN
resources/ios/splash/Default-Portrait~ipad.png


BIN
resources/ios/splash/Default@2x~iphone.png


BIN
resources/ios/splash/Default@2x~universal~anyany.png


BIN
resources/ios/splash/Default~iphone.png


BIN
resources/splash.png


+ 2 - 0
src/app/app.component.html

@@ -45,6 +45,8 @@
 
         <ion-item lines="none">
           <span slot="end">{{version_number}}</span>
+          <span slot="end" *ngIf="environment">(正式版)</span>
+          <span slot="end" *ngIf="!environment">(测试版)</span>
         </ion-item>
         <!-- <ion-list>
           <ion-list-header>

+ 13 - 6
src/app/app.component.ts

@@ -10,6 +10,7 @@ import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
 import { Device } from '@ionic-native/device/ngx';
 import { Update } from '../providers/update'
 import { menu_list } from './menu/menu'
+import { environment } from '../environments/environment'
 
 @Component({
   selector: 'app-root',
@@ -19,6 +20,7 @@ export class AppComponent {
   public loggedIn: boolean = false;
   public version_number: any
   public menuList = []
+  public environment = false
   constructor(
     private device: Device,
     private localNotifications: LocalNotifications,
@@ -33,12 +35,17 @@ export class AppComponent {
     private statusBar: StatusBar,
     // private wsService: WebSocketService
   ) {
+    if (environment.production) {
+      this.environment = true
+    }
     this.initializeApp();
     this.backButtonEvent()
   }
   ngOnInit() {
     this.initWebSocket()
-    this.getMenuList()
+    if (this.loggedIn) {
+      this.getMenuList()
+    }
     //WS连接的IP和端口提前保存在localStorage里,现在读出来
     // this.wsService.createObservableSocket(`ws://192.168.20.32:8804/websocket/403`);
     // this.wsService.sendMessage('testhis.fullScreenImaget')
@@ -57,16 +64,16 @@ export class AppComponent {
   async getMenuList() {
     let list = await this.userData.getAppMenu()
     let newList = []
-    for(let i of menu_list) {
+    for (let i of menu_list) {
       let filterArr = []
-      for(let j of i.children) {
-        let arr = list.filter(item=>{return item.menuId===j.id})
-        if(arr.length!==0) {
+      for (let j of i.children) {
+        let arr = list.filter(item => { return item.menuId === j.id })
+        if (arr.length !== 0) {
           filterArr = filterArr.concat(j)
         }
       }
       // 如果有符合的菜单项则push进去
-      if(filterArr.length!==0) {
+      if (filterArr.length !== 0) {
         newList.push({
           title: i.title,
           children: filterArr

+ 15 - 13
src/app/contract-detail/contract-detail.page.html

@@ -20,14 +20,14 @@
     <ion-label>采购合同号:</ion-label>
     <ion-input disabled>{{sscCode}}</ion-input>
   </ion-item>
-<!--  <ion-item>-->
-<!--    <ion-label>下单员:</ion-label>-->
-<!--    <ion-input disabled>{{sscCreator}}</ion-input>-->
-<!--  </ion-item>-->
-<!--  <ion-item>-->
-<!--    <ion-label>合同日期:</ion-label>-->
-<!--    <ion-datetime disabled [(ngModel)]="scpModifiedtime"></ion-datetime>-->
-<!--  </ion-item>-->
+  <!--  <ion-item>-->
+  <!--    <ion-label>下单员:</ion-label>-->
+  <!--    <ion-input disabled>{{sscCreator}}</ion-input>-->
+  <!--  </ion-item>-->
+  <!--  <ion-item>-->
+  <!--    <ion-label>合同日期:</ion-label>-->
+  <!--    <ion-datetime disabled [(ngModel)]="scpModifiedtime"></ion-datetime>-->
+  <!--  </ion-item>-->
   <ion-list *ngFor="let contract of contractDetailList">
     <ion-item-group>
       <ion-item-divider sticky>
@@ -38,7 +38,8 @@
     </ion-item-group>
     <ion-item lines="none">
       <span>产品图片:</span>
-      <img slot="end" *ngIf="contract.imgsrc" (click)="showFullScreenImage(contract)" [src]="contract.imgsrc" class="title-image"/>
+      <img slot="end" *ngIf="contract.imgsrc" (click)="showFullScreenImage(contract)" [src]="contract.imgsrc"
+        class="title-image" />
     </ion-item>
 
     <ion-item>
@@ -74,10 +75,11 @@
     </ion-item>
     <ion-item>
       <ion-label>QA日志图片:</ion-label>
-      <ion-thumbnail *ngIf="contract.imgUrl">
-        <ion-img [src]="contract.imgUrl" (click)="showFullScreenImage(contract.imgUrl)"></ion-img>
+      <ion-thumbnail *ngFor="let photo of contract.imgList index as i">
+        <ion-icon name="close-circle-outline" (click)="deletePicture(contract, i)">
+        </ion-icon>
+        <ion-img [src]="photo" (click)="showFullScreenImage(contract.imgUrl)"></ion-img>
       </ion-thumbnail>
-      <ion-icon *ngIf="contract.imgUrl" name="close-circle-outline" (click)="deletePicture(contract)" slot="end"></ion-icon>
     </ion-item>
   </ion-list>
-</ion-content>
+</ion-content>

+ 30 - 12
src/app/contract-detail/contract-detail.page.ts

@@ -34,11 +34,17 @@ export class ContractDetailPage implements OnInit {
           this.scpModifiedtime = JSON.parse(data).data[0].scpModifiedtime
           this.contractDetailList = JSON.parse(data).data
           for (let i of this.contractDetailList) {
+            i.imgList = [] // 初始化图片列表
+            i['qaIdList'] = []
             i.imgsrc = i.pictures[0].smallPicture
-            let data = await this.userData.getQAlog(val, i.pid)
-            if (JSON.parse(data).data.length !== 0) {
-              i.qalog = JSON.parse(data).data[0].mark
-              i.imgUrl = JSON.parse(data).data[0].picture.split(",")[0]
+            let qadata = await this.userData.getQAlog(val, i.pid)
+            if (JSON.parse(qadata).data.length !== 0) {
+              for (let j of JSON.parse(qadata).data) {
+                i['qaIdList'].push(j.id) // qa记录的id数组
+              }
+              i.qalog = JSON.parse(qadata).data[0].mark
+              i.imgList = JSON.parse(qadata).data[0].picture.split(",")
+              i.imageData = JSON.parse(qadata).data[0].picture
             }
           }
         }
@@ -63,27 +69,39 @@ export class ContractDetailPage implements OnInit {
     }
 
     this.camera.getPicture(options).then((imageData) => {
-      contract.showPicture = true
-      contract.imgData = imageData
-      contract.imgUrl = 'data:image/jpeg;base64,' + imageData
+      contract.imgList.push(
+        'data:image/jpeg;base64,' + imageData
+      )
+      // contract.imgUrl = 'data:image/jpeg;base64,' + imageData
+      if (contract.imageData) {
+        contract.imageData = contract.imageData + ',' + imageData
+      } else {
+        contract.imageData = '' + imageData
+      }
     }, (err) => {
       // Handle error
       console.log("Camera issue: " + err);
     });
   }
 
-  deletePicture(contract) {
-    contract.imgData = ''
-    contract.showPicture = false
+  deletePicture(contract, index) {
+    contract.imgList.splice(index, 1)
+    let arr = contract.imageData.split(',')
+    arr.splice(index,1)
+    contract.imageData = arr.toString()
   }
 
   async saveDetail() {
     for(let i of this.contractDetailList) {
-      if(i.qalog && i.imgData) {
+      // console.log(i)
+      for (let j of i['qaIdList']) {
+        this.userData.deleteSampleQa(j)
+      }
+      if(i.qalog && i.imageData) {
         // let file = []
         // file.push(i.imgData)
         let form = {
-          files: i.imgData,
+          files: i.imageData,
           mark: i.qalog,
           pId: i.pid,
           sscId: this.sscId

+ 4 - 6
src/app/sample-detail/sample-detail.page.html

@@ -86,13 +86,11 @@
     <ion-item>
       <ion-label>QA日志图片:</ion-label>
       <!-- <ng-container *ngFor="let photo of sample.imgList index as i"> -->
-      <ion-thumbnail *ngIf="sample.imgUrl">
-        <ion-img [src]="sample.imgUrl" (click)="showFullScreenImage(sample.imgUrl)"></ion-img>
+      <ion-thumbnail *ngFor="let photo of sample.imgList index as i">
+        <ion-icon name="close-circle-outline" (click)="deletePicture(sample, i)"></ion-icon>
+        <ion-img [src]="photo" (click)="showFullScreenImage(photo)">
+        </ion-img>
       </ion-thumbnail>
-      <ion-icon *ngIf="sample.imgUrl" name="close-circle-outline" (click)="deletePicture(sample)" slot="end"></ion-icon>
-    <!-- </ng-container> -->
-      <!-- <ion-label>{{sample.imgUrl}}</ion-label> -->
-      
     </ion-item>
     <!-- <ion-grid>
       <ion-row>

+ 43 - 24
src/app/sample-detail/sample-detail.page.ts

@@ -26,21 +26,34 @@ export class SampleDetailPage implements OnInit {
   sdpModifydate = ""
   sampleDetailList = []
   ngOnInit() {
+    this.initialData()
+  }
+  ionViewDidEnter() {
+    this.defaultHref = `/sample-table`;
+  }
+
+  async initialData() {
+
     this.storage.get('sdId').then(async (val) => {
       if (val) {
         let data = await this.userData.getSampleDetail(val)
-        console.log(JSON.parse(data))
         if (JSON.parse(data).data.length !== 0) {
           this.sdpPost = JSON.parse(data).data[0].sdpPost
           this.sdpModifydate = JSON.parse(data).data[0].sdpModifydate
           this.sampleDetailList = JSON.parse(data).data
           for (let i of this.sampleDetailList) {
+            i.imgList = [] // 初始化图片列表
+            i['qaIdList'] = []
             i.imgsrc = i.pictures[0].smallPicture
-            let data = await this.userData.getSampleQAlog(i.sdpId)
-            if (JSON.parse(data).data.length !== 0) {
-              i.qalog = JSON.parse(data).data[0].mark
-              i.imgUrl = JSON.parse(data).data[0].picture.split(",")[0]
-              // i.imgList = JSON.parse(data).data[0].picture.split(",")
+            let qadata = await this.userData.getSampleQAlog(i.sdpId)
+            if (JSON.parse(qadata).data.length !== 0) {
+              for (let j of JSON.parse(qadata).data) {
+                i['qaIdList'].push(j.id) // qa记录的id数组
+              }
+              i.qalog = JSON.parse(qadata).data[0].mark
+              // i.imgUrl = JSON.parse(data).data[0].picture.split(",")[0]
+              i.imgList = JSON.parse(qadata).data[0].picture.split(",")
+              i.imageData = JSON.parse(qadata).data[0].picture
             }
           }
         }
@@ -50,9 +63,7 @@ export class SampleDetailPage implements OnInit {
       this.sdDocument = val
     })
   }
-  ionViewDidEnter() {
-    this.defaultHref = `/sample-table`;
-  }
+
   takePicture(sample) {
     const options: CameraOptions = {
       quality: 50,
@@ -62,31 +73,39 @@ export class SampleDetailPage implements OnInit {
     }
 
     this.camera.getPicture(options).then((imageData) => {
-      // sample.imgList.push(
-      //   'data:image/jpeg;base64,' + imageData
-      // )
-      sample.imgUrl = 'data:image/jpeg;base64,' + imageData
-      sample.imgData = imageData
-      // sample.imgData.push(imageData)
+      sample.imgList.push(
+        'data:image/jpeg;base64,' + imageData
+      )
+      // sample.imgUrl = 'data:image/jpeg;base64,' + imageData
+      if (sample.imageData) {
+        sample.imageData = sample.imageData + ',' + imageData
+      } else {
+        sample.imageData = '' + imageData
+      }
     }, (err) => {
       // Handle error
       console.log("Camera issue: " + err);
     });
   }
 
-  showFullScreenImage(data) {
+  async showFullScreenImage(data) {
+    //这里的imagePath用你的图片路径来替换;
+    // this.commonService.getBase64('http://www.sgsino.cn/fastdfs/group1/M00/15/E8/wKgUJl3VBjeAbDF_ABN3Pa_QkCA218.jpg')
     this.commonService.fullScreenImg(data)
   }
 
   async saveDetail() {
     for (let i of this.sampleDetailList) {
-      if (i.qalog && i.imgData) {
+      for (let j of i['qaIdList']) {
+        this.userData.deleteSampleQa(j)
+      }
+      if (i.qalog && i.imageData) { 
         let form = {
           sdpId: i.sdpId,
           mark: i.qalog,
-          files: i.imgData
+          files: i.imageData
         }
-        await this.userData.saveSampleDetail(form)
+        this.userData.saveSampleDetail(form)
       }
     }
   }
@@ -101,10 +120,10 @@ export class SampleDetailPage implements OnInit {
     return new Blob([new Uint8Array(array)], { type: type });
   }
 
-  deletePicture(sample) {
-    sample.imgUrl = ''
-    sample.imgData = ''
-    // sample.imgList.splice(index)
-    // sample.imgData.splice(index)
+  deletePicture(sample, index) {
+    sample.imgList.splice(index, 1)
+    let arr = sample.imageData.split(',')
+    arr.splice(index,1)
+    sample.imageData = arr.toString()
   }
 }

+ 6 - 6
src/app/sample-table/sample-table.page.html

@@ -51,11 +51,11 @@
         <ion-label>客户名称: </ion-label>
         <ion-label>{{sample.sdSelf}}</ion-label>
       </div>
-<!--      <div class="sample-column">-->
-<!--        <ion-icon name="contact"></ion-icon>-->
-<!--        <ion-label>客户联系人: </ion-label>-->
-<!--        <ion-label>{{sample.cfullname}}</ion-label>-->
-<!--      </div>-->
+      <!--      <div class="sample-column">-->
+      <!--        <ion-icon name="contact"></ion-icon>-->
+      <!--        <ion-label>客户联系人: </ion-label>-->
+      <!--        <ion-label>{{sample.cfullname}}</ion-label>-->
+      <!--      </div>-->
       <div class="sample-column">
         <ion-icon name="flag"></ion-icon>
         <ion-label>标记: </ion-label>
@@ -68,4 +68,4 @@
       </ion-item-options>
     </ion-item-sliding> -->
   </ion-card>
-</ion-content>
+</ion-content>

+ 7 - 6
src/app/store-qc-detail/store-qc-detail.page.html

@@ -103,8 +103,9 @@
     </ion-item>
     <ion-item>
       <ion-label>qa日志图片:</ion-label>
-      <ion-thumbnail *ngIf="qc.qaimgUrl">
-        <ion-img [src]="qc.qaimgUrl" (click)="showFullScreenImage(qc.qaimgUrl)"></ion-img>
+      <ion-thumbnail *ngFor="let photo of qc.qaimgList index as i">
+        <ion-img [src]="photo" (click)="showFullScreenImage(photo)">
+        </ion-img>
       </ion-thumbnail>
       <!-- <ion-icon *ngIf="qc.showPicture" name="close-circle-outline" (click)="deletePicture(qc)" slot="end"> -->
       <!-- </ion-icon> -->
@@ -118,11 +119,11 @@
     </ion-item>
     <ion-item>
       <ion-label>QC日志图片:</ion-label>
-      <ion-thumbnail *ngIf="qc.qcimgUrl">
-        <ion-img [src]="qc.qcimgUrl" (click)="showFullScreenImage(qc.qcimgUrl)"></ion-img>
+      <ion-thumbnail *ngFor="let photo of qc.qcimgList index as i">
+          <ion-icon name="close-circle-outline" (click)="deletePicture(qc, i)"></ion-icon>
+        <ion-img [src]="photo" (click)="showFullScreenImage(photo)">
+        </ion-img>
       </ion-thumbnail>
-      <ion-icon *ngIf="qc.qcimgUrl" name="close-circle-outline" (click)="deletePicture(qc)" slot="end">
-      </ion-icon>
     </ion-item>
   </ion-list>
   <div class="ion-padding">

+ 27 - 14
src/app/store-qc-detail/store-qc-detail.page.ts

@@ -60,15 +60,22 @@ export class StoreQCDetailPage implements OnInit {
       for (let i of this.qcData['details']) {
         this.showDetail = false
         // 获取QA日志
+        i.qaimgList = []
+        i.qcimgList = []
+        i['qcIdList'] = []
         let qalogdata = await this.userData.getQAlog(i.sscId, i.pid)
         if (JSON.parse(qalogdata).data.length !== 0) {
           i.qalog = JSON.parse(qalogdata).data[0].mark
-          i.qaimgUrl = JSON.parse(qalogdata).data[0].picture.split(",")[0]
+          i.qaimgList = JSON.parse(qalogdata).data[0].picture.split(",")
         }
         let qclogdata = await this.userData.getQClog(i.sscId, i.pid)
         if (JSON.parse(qclogdata).data.length !== 0) {
+          for (let j of JSON.parse(qclogdata).data) {
+            i['qcIdList'].push(j.id) // qc记录的id数组
+          }
           i.qclog = JSON.parse(qclogdata).data[0].mark
-          i.qcimgUrl = JSON.parse(qclogdata).data[0].picture.split(",")[0]
+          i.qcimgList = JSON.parse(qclogdata).data[0].picture.split(",")
+          i.imageData = JSON.parse(qclogdata).data[0].picture
         }
         // 处理意见转换boolean
         if (i.dealpropose == 1) {
@@ -94,19 +101,25 @@ export class StoreQCDetailPage implements OnInit {
     }
 
     this.camera.getPicture(options).then((imageData) => {
-      // console.log(imageData)
-      qc.showPicture = true
-      qc.imgData = imageData
-      qc.qcimgUrl = 'data:image/jpeg;base64,' + imageData
+      qc.qcimgList.push(
+        'data:image/jpeg;base64,' + imageData
+      )
+      if (qc.imageData) {
+        qc.imageData = qc.imageData + ',' + imageData
+      } else {
+        qc.imageData = '' + imageData
+      }
     }, (err) => {
       // Handle error
       console.log("Camera issue: " + err);
     });
   }
 
-  deletePicture(qc) {
-    qc.imgData = ''
-    qc.qcimgUrl = ''
+  deletePicture(qc, index) {
+    qc.qcimgList.splice(index, 1)
+    let arr = qc.imageData.split(',')
+    arr.splice(qc,1)
+    qc.imageData = arr.toString()
   }
 
   // async presentPopover(event: Event) {
@@ -125,12 +138,12 @@ export class StoreQCDetailPage implements OnInit {
 
   async addQClog() {
     for (let i of this.qcData['details']) {
-      // console.log(i)
-      if (i.qclog && i.imgData) {
-        // let file = []
-        // file.push(i.imgData)
+      for (let j of i['qcIdList']) {
+        this.userData.deleteSampleQc(j)
+      }
+      if (i.qclog && i.imageData) {
         let form = {
-          files: i.imgData,
+          files: i.imageData,
           mark: i.qclog,
           pId: i.pid,
           sscId: i.sscId

+ 7 - 6
src/app/store-qc-scanning/store-qc-scanning.page.html

@@ -87,8 +87,9 @@
     </ion-item>
     <ion-item>
       <ion-label>qa日志图片:</ion-label>
-      <ion-thumbnail *ngIf="qc.qaimgUrl">
-        <ion-img [src]="qc.qaimgUrl" (click)="showFullScreenImage(qc.qaimgUrl)"></ion-img>
+      <ion-thumbnail *ngFor="let photo of qc.qaimgList index as i">
+        <ion-img [src]="photo" (click)="showFullScreenImage(photo)">
+        </ion-img>
       </ion-thumbnail>
       <!-- <ion-icon *ngIf="qc.showPicture" name="close-circle-outline" (click)="deletePicture(qc)" slot="end"> -->
       <!-- </ion-icon> -->
@@ -102,11 +103,11 @@
     </ion-item>
     <ion-item>
       <ion-label>QC日志图片:</ion-label>
-      <ion-thumbnail *ngIf="qc.qcimgUrl">
-        <ion-img [src]="qc.qcimgUrl" (click)="showFullScreenImage(qc.qcimgUrl)"></ion-img>
+      <ion-thumbnail *ngFor="let photo of qc.qcimgList index as i">
+        <ion-icon name="close-circle-outline" (click)="deletePicture(qc, i)"></ion-icon>
+        <ion-img [src]="photo" (click)="showFullScreenImage(photo)">
+        </ion-img>
       </ion-thumbnail>
-      <ion-icon *ngIf="qc.qcimgUrl" name="close-circle-outline" (click)="deletePicture(qc)" slot="end">
-      </ion-icon>
     </ion-item>
     <!-- <ion-item>
       <ion-label>

+ 28 - 12
src/app/store-qc-scanning/store-qc-scanning.page.ts

@@ -96,16 +96,24 @@ export class StoreQCScanningPage implements OnInit {
           this.storeQCDetailList = new Array(data)
         }
         for (let i of this.storeQCDetailList) {
+          i.qaimgList = []
+          i.qcimgList = []
+          i['qcIdList'] = []
           // 获取QA日志
           let qalogdata = await this.userData.getQAlog(i.sscId, i.pid)
           if (JSON.parse(qalogdata).data.length !== 0) {
             i.qalog = JSON.parse(qalogdata).data[0].mark
-            i.qaimgUrl = JSON.parse(qalogdata).data[0].picture.split(",")[0]
+            i.qaimgList = JSON.parse(qalogdata).data[0].picture.split(",")
           }
           let qclogdata = await this.userData.getQClog(i.sscId, i.pid)
           if (JSON.parse(qclogdata).data.length !== 0) {
+            for (let j of JSON.parse(qclogdata).data) {
+              i['qcIdList'].push(j.id) // qc记录的id数组
+            }
             i.qclog = JSON.parse(qclogdata).data[0].mark
-            i.qcimgUrl = JSON.parse(qclogdata).data[0].picture.split(",")[0]
+            i.qcimgList = JSON.parse(qclogdata).data[0].picture.split(",")
+            i.imageData = JSON.parse(qclogdata).data[0].picture
+            // i.qcimgUrl = JSON.parse(qclogdata).data[0].picture.split(",")[0]
           }
           // 处理意见转换boolean(无deal)
           if (i.deal === undefined) {
@@ -164,11 +172,12 @@ export class StoreQCScanningPage implements OnInit {
   // 添加qc记录
   async addQClog() {
     for (let i of this.storeQCDetailList) {
-      if (i.qclog && i.imgData) {
-        // let file = []
-        // file.push(i.imgData)
+      for (let j of i['qcIdList']) {
+        this.userData.deleteSampleQc(j)
+      }
+      if (i.qclog && i.imageData) {
         let form = {
-          files: i.imgData,
+          files: i.imageData,
           mark: i.qclog,
           pId: i.pid,
           sscId: i.sscId
@@ -187,9 +196,14 @@ export class StoreQCScanningPage implements OnInit {
     }
 
     this.camera.getPicture(options).then((imageData) => {
-      // console.log(imageData)
-      qc.imgData = imageData
-      qc.qcimgUrl = 'data:image/jpeg;base64,' + imageData
+      qc.qcimgList.push(
+        'data:image/jpeg;base64,' + imageData
+      )
+      if (qc.imageData) {
+        qc.imageData = qc.imageData + ',' + imageData
+      } else {
+        qc.imageData = '' + imageData
+      }
     }, (err) => {
       // Handle error
       console.log("Camera issue: " + err);
@@ -204,9 +218,11 @@ export class StoreQCScanningPage implements OnInit {
     });
   }
 
-  deletePicture(qc) {
-    qc.imgData = ''
-    qc.qcimgUrl = ''
+  deletePicture(qc, index) {
+    qc.qcimgList.splice(index, 1)
+    let arr = qc.imageData.split(',')
+    arr.splice(qc,1)
+    qc.imageData = arr.toString()
   }
 
   deleteQCStore(store, index) {

+ 2 - 1
src/environments/environment.prod.ts

@@ -1,3 +1,4 @@
 export const environment = {
-  production: true
+  production: true,
+  APP_SERVE_URL: 'http://www.sgsino.cn/api'
 };

+ 2 - 1
src/environments/environment.ts

@@ -3,7 +3,8 @@
 // The list of file replacements can be found in `angular.json`.
 
 export const environment = {
-  production: false
+  production: false,
+  APP_SERVE_URL: 'http://dev.sgsino.cn'
 };
 
 /*

+ 36 - 8
src/providers/common.service.ts

@@ -1,18 +1,46 @@
 import { Injectable } from "@angular/core"
 import { PhotoViewer } from '@ionic-native/photo-viewer/ngx';
+import { HTTP } from '@ionic-native/http/ngx'
 
 @Injectable({
-    providedIn: 'root'
+  providedIn: 'root'
 })
 
 export class commonService {
-    constructor(private photoViewer: PhotoViewer, ) { }
+  constructor(private photoViewer: PhotoViewer, private http: HTTP) { }
 
-    fullScreenImg(data) {
-        if (typeof data === 'string') {
-            this.photoViewer.show(data)
-        } else {
-            this.photoViewer.show(data.pictures[0].bigPicture);
-        }
+  fullScreenImg(data) {
+    if (typeof data === 'string') {
+      this.photoViewer.show(data)
+    } else {
+      this.photoViewer.show(data.pictures[0].bigPicture);
     }
+  }
+
+  convertBase64(url) {
+    this.http.get(url, {}, {'responseType':'blob'})
+      .then(data => {
+        console.log(data.status);
+        console.log(data.data); // data received by server
+        console.log(data.headers);
+      })
+      .catch(error => {
+        console.log(error.status);
+        console.log(error.error); // error message as string
+        console.log(error.headers);
+      });
+  }
+  // toDataUrl(url, callback) {
+  //   var xhr = new XMLHttpRequest();
+  //   xhr.onload = function () {
+  //     var reader = new FileReader();
+  //     reader.onloadend = function () {
+  //       callback(reader.result);
+  //     }
+  //     reader.readAsDataURL(xhr.response);
+  //   };
+  //   xhr.open('GET', url);
+  //   xhr.responseType = 'blob';
+  //   xhr.send();
+  // }
 }

+ 1 - 1
src/providers/update.ts

@@ -53,7 +53,7 @@ export class Update {
 
     getServerVersionNumber() {
         return new Promise((resolve, reject) => {
-            this.nativeHttp.get('http://192.168.20.15:803/SoftUpdate/SgApp/version.json', {}, {})
+            this.nativeHttp.get('http://sg.sgshanghai.com:803/SoftUpdate/SgApp/version.json', {}, {})
                 .then(data => {
                     resolve(JSON.parse(data.data).version)
                 })

+ 94 - 31
src/providers/user-data.ts

@@ -7,6 +7,7 @@ import { Router } from '@angular/router';
 import { AlertController } from '@ionic/angular';
 import { finalize } from 'rxjs/operators';
 import { queryForm } from './query';
+import { environment } from '../environments/environment';
 
 
 @Injectable({
@@ -55,7 +56,7 @@ export class UserData {
       // this.nativeHttp.setDataSerializer('json')
 
       // tslint:disable-next-line:max-line-length
-      from(this.nativeHttp.post(`http://dev.sgsino.cn/auth/oauth/token?username=${account}&password=${encodeURIComponent(password)}&grant_type=password&scope=server`,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/auth/oauth/token?username=${account}&password=${encodeURIComponent(password)}&grant_type=password&scope=server`,
         {},
         { Authorization: 'Basic cGlnOnBpZw==', TENANT_ID: '1', isToken: 'false', })).pipe(
           finalize(() => loading.dismiss())
@@ -77,7 +78,7 @@ export class UserData {
         }, async err => {
           console.log(err);
           const toast = await this.toastCtrl.create({
-            message: '登录失败',
+            message: err.error+err.url,
             duration: 1000,
             position: 'top'
           });
@@ -104,7 +105,7 @@ export class UserData {
   async getAppMenu(): Promise<any> {
     const token = await this.getToken();
     return new Promise((resolve, reject) => {
-    from(this.nativeHttp.get('http://dev.sgsino.cn/admin/menu/app',
+    from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/admin/menu/app`,
       {},
       { Authorization: `Bearer ${token}`,'Content-Type': 'application/json;charset=UTF-8' })).pipe(
         finalize(() => { })
@@ -156,7 +157,7 @@ export class UserData {
     await loading.present();
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
-    from(this.nativeHttp.post(`http://dev.sgsino.cn/production/sample/factory/`,
+    from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/production/sample/factory/`,
       data,
       headers)).pipe(
         finalize(() => { })
@@ -182,7 +183,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post('http://dev.sgsino.cn/production/sample/factory/pCode',
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/production/sample/factory/pCode`,
         data,
         headers)).pipe(
           finalize(() => { })
@@ -218,7 +219,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post('http://dev.sgsino.cn/production/sample/factory/details/',
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/production/sample/factory/details/`,
         data,
         headers)).pipe(
           finalize(() => { })
@@ -256,7 +257,7 @@ export class UserData {
     await loading.present();
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
-    from(this.nativeHttp.post(`http://dev.sgsino.cn/search/samples/mobile/page`,
+    from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/search/samples/mobile/page`,
       form,
       headers)).pipe(
         finalize(() => loading.dismiss())
@@ -282,7 +283,7 @@ export class UserData {
     await loading.present();
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
-    from(this.nativeHttp.post(`http://dev.sgsino.cn/search/supplier/contract/mobile/page`,
+    from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/search/supplier/contract/mobile/page`,
       form,
       headers)).pipe(
         finalize(() => loading.dismiss())
@@ -310,7 +311,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/production/samples/mobile/${sdId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/production/samples/mobile/${sdId}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -335,7 +336,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/production/samples/mobile/qalog/${sdpId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/production/samples/mobile/qalog/${sdpId}`, {},
         headers)).pipe(
           finalize(() => { })
         ).subscribe(async data => {
@@ -364,7 +365,7 @@ export class UserData {
     //   })
     const header = { Authorization: `Bearer ${token}` };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post(`http://dev.sgsino.cn/production/samples/mobile/qalog`, form,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/production/samples/mobile/qalog`, form,
         header)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -394,6 +395,68 @@ export class UserData {
     });
   }
 
+   // 删除qa日志
+   async deleteSampleQa(id: any): Promise<any> {
+    const token = await this.getToken();
+    const loading = await this.loadingCtrl.create();
+    await loading.present();
+    const header = { Authorization: `Bearer ${token}` };
+    return new Promise((resolve, reject) => {
+      from(this.nativeHttp.delete(`${environment.APP_SERVE_URL}/inventory/qa/mobile/qalog/${id}`, {},
+        header)).pipe(
+          finalize(() => loading.dismiss())
+        ).subscribe(async data => {
+          if (JSON.parse(data.data).code == 1) {
+            const toast = await this.toastCtrl.create({
+              message: JSON.parse(data.data).msg,
+              duration: 1000,
+              position: 'top'
+            });
+            await toast.present();
+          }
+        }, async err => {
+          console.log(err);
+          const toast = await this.toastCtrl.create({
+            message: '操作失败',
+            duration: 1000,
+            position: 'top'
+          });
+          await toast.present();
+        });
+    });
+  }
+
+     // 删除qc日志
+     async deleteSampleQc(id: any): Promise<any> {
+      const token = await this.getToken();
+      const loading = await this.loadingCtrl.create();
+      await loading.present();
+      const header = { Authorization: `Bearer ${token}` };
+      return new Promise((resolve, reject) => {
+        from(this.nativeHttp.delete(`${environment.APP_SERVE_URL}/inventory/qc/mobile/qclog/${id}`, {},
+          header)).pipe(
+            finalize(() => loading.dismiss())
+          ).subscribe(async data => {
+            if (JSON.parse(data.data).code == 1) {
+              const toast = await this.toastCtrl.create({
+                message: JSON.parse(data.data).msg,
+                duration: 1000,
+                position: 'top'
+              });
+              await toast.present();
+            }
+          }, async err => {
+            console.log(err);
+            const toast = await this.toastCtrl.create({
+              message: '操作失败',
+              duration: 1000,
+              position: 'top'
+            });
+            await toast.present();
+          });
+      });
+    }
+
   // 获取采购合同详情
   async getContractDetail(sscId: Number): Promise<any> {
     const token = await this.getToken();
@@ -402,7 +465,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/production/purchase/mobile/${sscId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/production/purchase/mobile/${sscId}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -427,7 +490,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('urlencoded');
     const headers = { Authorization: `Bearer ${token}` };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post('http://dev.sgsino.cn/inventory/qa/mobile/qalog', form,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/inventory/qa/mobile/qalog`, form,
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -463,7 +526,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}` };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/qa/mobile/qalog/${sscId}/${pId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/qa/mobile/qalog/${sscId}/${pId}`, {},
         headers)).pipe(
           finalize(() => { })
         ).subscribe(async data => {
@@ -485,7 +548,7 @@ export class UserData {
     const token = await this.getToken();
     const headers = { Authorization: `Bearer ${token}` };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/qc/mobile/qclog/${sscId}/${pId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/qc/mobile/qclog/${sscId}/${pId}`, {},
         headers)).pipe(
           finalize(() => { })
         ).subscribe(async data => {
@@ -510,7 +573,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/enterStore/mobile/detail?sscId=${sscId}&pId=${pId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/enterStore/mobile/detail?sscId=${sscId}&pId=${pId}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -544,7 +607,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/shelf/mobile/code?code=${code}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/shelf/mobile/code?code=${code}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -578,7 +641,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post(`http://dev.sgsino.cn/inventory/enterStore/mobile/`, list,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/inventory/enterStore/mobile/`, list,
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -623,7 +686,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/shelf/mobile?${current}&${size}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/shelf/mobile?${current}&${size}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -657,7 +720,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.put(`http://dev.sgsino.cn/inventory/shelf/mobile`, list,
+      from(this.nativeHttp.put(`${environment.APP_SERVE_URL}/inventory/shelf/mobile`, list,
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -701,7 +764,7 @@ export class UserData {
     await loading.present();
     const headers = { Authorization: `Bearer ${token}` };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.put(`http://dev.sgsino.cn/inventory/shelf/mobile/lend?code=${code}`, {},
+      from(this.nativeHttp.put(`${environment.APP_SERVE_URL}/inventory/shelf/mobile/lend?code=${code}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -747,7 +810,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/shelf/mobile/12`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/shelf/mobile/12`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -771,7 +834,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post('http://dev.sgsino.cn/inventory/shelf/mobile/bind/sample', list,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/inventory/shelf/mobile/bind/sample`, list,
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -808,7 +871,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/qc/mobile/Pending?${current}&${size}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/qc/mobile/Pending?${current}&${size}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -842,7 +905,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/shelf/mobile/pending?${current}&${size}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/shelf/mobile/pending?${current}&${size}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -876,7 +939,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/warehouse/mobile/pending?${current}&${size}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/warehouse/mobile/pending?${current}&${size}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -912,7 +975,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.put(`http://dev.sgsino.cn/inventory/warehouse/mobile/prepare?sscId=${sscId}&pId=${pId}`, {},
+      from(this.nativeHttp.put(`${environment.APP_SERVE_URL}/inventory/warehouse/mobile/prepare?sscId=${sscId}&pId=${pId}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -957,7 +1020,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/qc/mobile?${current}&${size}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/qc/mobile?${current}&${size}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -991,7 +1054,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.get(`http://dev.sgsino.cn/inventory/qc/mobile/detail?sscId=${sscId}&pId=${pId}`, {},
+      from(this.nativeHttp.get(`${environment.APP_SERVE_URL}/inventory/qc/mobile/detail?sscId=${sscId}&pId=${pId}`, {},
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -1028,7 +1091,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('json');
     const headers = { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8' };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post('http://dev.sgsino.cn/inventory/qc/mobile', form,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/inventory/qc/mobile`, form,
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {
@@ -1069,7 +1132,7 @@ export class UserData {
     this.nativeHttp.setDataSerializer('urlencoded');
     const headers = { Authorization: `Bearer ${token}` };
     return new Promise((resolve, reject) => {
-      from(this.nativeHttp.post('http://dev.sgsino.cn/inventory/qc/mobile/qclog', form,
+      from(this.nativeHttp.post(`${environment.APP_SERVE_URL}/inventory/qc/mobile/qclog`, form,
         headers)).pipe(
           finalize(() => loading.dismiss())
         ).subscribe(async data => {