diff --git a/base-ui/package-18.json b/base-ui/package-18.json new file mode 100644 index 00000000..f15b9d2c --- /dev/null +++ b/base-ui/package-18.json @@ -0,0 +1,69 @@ +{ + "name": "admin-template", + "version": "4.4.0", + "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint", + "author": "Pan ", + "scripts": { + "dev": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", + "build:prod": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "lint": "eslint --ext .js,.vue src", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit" + }, + "dependencies": { + "axios": "0.18.1", + "core-js": "^3.26.1", + "element-ui": "2.13.2", + "js-cookie": "2.2.0", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "portfinder": "^1.0.21", + "qs": "^6.9.4", + "sass-resources-loader": "^2.1.1", + "viewerjs": "^1.9.0", + "vue": "2.6.10", + "vue-amap": "^0.5.10", + "vue-router": "3.0.6", + "vuex": "3.1.0", + "vuex-persistedstate": "^4.0.0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.4", + "@vue/cli-plugin-eslint": "4.4.4", + "@vue/cli-plugin-unit-jest": "4.4.4", + "@vue/cli-service": "4.4.4", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "9.5.1", + "babel-eslint": "10.1.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "babel-polyfill": "^6.26.0", + "chalk": "2.4.2", + "connect": "3.6.6", + "eslint": "6.7.2", + "eslint-plugin-vue": "6.2.2", + "html-webpack-plugin": "3.2.0", + "mockjs": "1.0.1-beta3", + "runjs": "4.3.2", + "sass": "1.26.8", + "sass-loader": "8.0.2", + "script-ext-html-webpack-plugin": "2.1.3", + "serve-static": "1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.2", + "vue-template-compiler": "2.6.10" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "license": "MIT" +} diff --git a/base-ui/src/api/kucun/wholesale.js b/base-ui/src/api/kucun/wholesale.js new file mode 100644 index 00000000..e69de29b diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesale.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesale.java new file mode 100644 index 00000000..6c9046c5 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesale.java @@ -0,0 +1,30 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.yxt.common.core.domain.EntityWithId; +import lombok.Data; + +@Data +@TableName("gd_wholesale") +public class GdWholesale extends EntityWithId { + + private String orgCode; // 企业组织机构代码证 + private String orderType; // 订单类型 + private String orderNo; // 销售订单号 + private String prodCode; // 商品编码 + private String prodBarCode; // 商品条码 + private String prodName; // 商品名称 + private String brandCode; // 品牌代码 + private String brandName; // 品牌名称 + private String categoryb; // 商品大类 + private String categorym; // 商品中类 + private String categorys; // 商品小类 + private String customerCode; // 客户代码 + private String customerName; // 客户名称 + private String saleNum; // 销售数量 + private String storeCode; // 销售渠道 + private String salePrice; // 销售价格 + private String saleCost; // 销售成本 + private String profit; // 利润 + private String dataDate; // 数据日期 +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGd.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGd.java new file mode 100644 index 00000000..44e47f12 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGd.java @@ -0,0 +1,30 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.yxt.common.core.domain.EntityWithId; +import lombok.Data; + +@Data +@TableName("gd_wholesale_gd") +public class GdWholesaleGd extends EntityWithId { + + private String orgCode; // 企业组织机构代码证 + private String orderType; // 订单类型 + private String orderNo; // 销售订单号 + private String prodCode; // 商品编码 + private String prodBarCode; // 商品条码 + private String prodName; // 商品名称 + private String brandCode; // 品牌代码 + private String brandName; // 品牌名称 + private String categoryb; // 商品大类 + private String categorym; // 商品中类 + private String categorys; // 商品小类 + private String customerCode; // 客户代码 + private String customerName; // 客户名称 + private String saleNum; // 销售数量 + private String storeCode; // 销售渠道 + private String salePrice; // 销售价格 + private String saleCost; // 销售成本 + private String profit; // 利润 + private String dataDate; // 数据日期 +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGdMapper.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGdMapper.java new file mode 100644 index 00000000..d5021086 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGdMapper.java @@ -0,0 +1,13 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface GdWholesaleGdMapper extends BaseMapper { + + @Delete("delete from gd_wholesale_gd where dataDate=#{dataDate} ") + void clearByDataDate(@Param("dataDate") String dataDate); +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGdService.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGdService.java new file mode 100644 index 00000000..61425a75 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleGdService.java @@ -0,0 +1,11 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class GdWholesaleGdService extends ServiceImpl { + public void clearByDataDate(String dataDate) { + baseMapper.clearByDataDate(dataDate); + } +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLog.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLog.java new file mode 100644 index 00000000..8aafa397 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLog.java @@ -0,0 +1,31 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yxt.common.core.domain.EntityWithId; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("gd_wholesale_log") +public class GdWholesaleLog extends EntityWithId { + public GdWholesaleLog() { + } + + public GdWholesaleLog(String fileFullPath) { + this.fileFullPath = fileFullPath; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime = new Date(); // 记录创建时间/ + private String remarks; // 备注说明', + private String fileFullPath; // 文件完整路径', + private String outFilePath; // 汇总文件路径', + private String fileUrl; // 文件下载地址', + private int allNum = 0; // 总记录数', + private int validNum = 0; // 有效记录数', + private long durations = 0; // 程序运行时长', + private int errRowNum = 0; // 出错的条数', + private String orderDate; // 单据日期', +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErr.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErr.java new file mode 100644 index 00000000..680765a0 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErr.java @@ -0,0 +1,24 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yxt.common.core.domain.EntityWithId; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("gd_wholesale_log_err") +public class GdWholesaleLogErr extends EntityWithId { + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime = new Date(); // 记录创建时间', + private String remarks; // 备注说明', + private String fileFullPath; // 文件完整路径', + private String errInfo; // 异常信息', + private String rowContent; // 原记录内容', + private int rowNum; // 出错行数', + private String orderDate; // 单据日期 + private String orderNo; // 销售订单号 + private String prodCode; //商品编码 + private String prodName; //商品名称 +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErrMapper.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErrMapper.java new file mode 100644 index 00000000..fdbf60f6 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErrMapper.java @@ -0,0 +1,8 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface GdWholesaleLogErrMapper extends BaseMapper { +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErrService.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErrService.java new file mode 100644 index 00000000..8e124744 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogErrService.java @@ -0,0 +1,8 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class GdWholesaleLogErrService extends ServiceImpl { +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogMapper.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogMapper.java new file mode 100644 index 00000000..419d55ed --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogMapper.java @@ -0,0 +1,8 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface GdWholesaleLogMapper extends BaseMapper { +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogService.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogService.java new file mode 100644 index 00000000..da781a01 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleLogService.java @@ -0,0 +1,8 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class GdWholesaleLogService extends ServiceImpl { +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleMapper.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleMapper.java new file mode 100644 index 00000000..5395fcc5 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleMapper.java @@ -0,0 +1,13 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface GdWholesaleMapper extends BaseMapper { + + @Delete("delete from gd_wholesale where dataDate=#{dataDate} ") + void clearByDataDate(@Param("dataDate") String dataDate); +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleRest.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleRest.java new file mode 100644 index 00000000..5a62caf2 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleRest.java @@ -0,0 +1,28 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import com.yxt.common.core.result.ResultBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController("com.yxt.supervise.portal.biz.gdwholesale.GdWholesaleRest") +@RequestMapping("/wholesale") +public class GdWholesaleRest { + + @Autowired + private GdWholesaleService gdWholesaleService; + + + /** + * 上传配送中心批发数据 + * @param file + * @return + */ + @PostMapping("/uploadPszxpfsj") + public ResultBean uploadGdData(@RequestParam("file") MultipartFile file) { + return gdWholesaleService.uploadAndInsert(file); + } +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleService.java b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleService.java new file mode 100644 index 00000000..70494227 --- /dev/null +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/java/com/yxt/supervise/portal/biz/gdwholesale/GdWholesaleService.java @@ -0,0 +1,123 @@ +package com.yxt.supervise.portal.biz.gdwholesale; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.sax.handler.RowHandler; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yxt.common.base.config.component.FileUploadComponent; +import com.yxt.common.core.result.FileUploadResult; +import com.yxt.common.core.result.ResultBean; +import com.yxt.supervise.portal.biz.gdinventory.GdRescategoryProdService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GdWholesaleService extends ServiceImpl { + + @Autowired + private FileUploadComponent fileUploadComponent; + @Autowired + private GdWholesaleLogService gdWholesaleLogService; + @Autowired + private GdRescategoryProdService gdRescategoryProdService; + @Autowired + private GdWholesaleGdService gdWholesaleGdService; + + public ResultBean uploadAndInsert(MultipartFile file) { + ResultBean rb = ResultBean.fireFail(); + + ResultBean fub = fileUploadComponent.uploadFile(file, "pszxpfsj"); + String filePath = fub.getData().getFilePath(); + String fp = fileUploadComponent.getUploadPath() + filePath; + + long millis = System.currentTimeMillis(); + GdWholesaleLog gdlog = new GdWholesaleLog(fp); + ExcelUtil.read07BySax(fp, -1, createRowHandler(gdlog)); + gdlog.setDurations(System.currentTimeMillis() - millis); + gdWholesaleLogService.save(gdlog); + + return rb.success().setData(gdlog); + } + + private RowHandler createRowHandler(GdWholesaleLog gdlog) { + return new RowHandler() { + + private List toInsertListGd = new ArrayList<>(); + private List toInsertList = new ArrayList<>(); + private List errList = new ArrayList<>(); + private int x = 0, y = 0, errnum = 0; + private String odate = null; + + private GdWholesaleGd rowToEntity(List r) { + GdWholesaleGd gd = new GdWholesaleGd(); + gd.setOrgCode("" + r.get(0)); // 企业组织机构代码证 + gd.setOrderType("" + r.get(1)); // 订单类型 + gd.setOrderNo("" + r.get(2)); // 销售订单号 + gd.setProdCode("" + r.get(3)); // 商品编码 + gd.setProdBarCode("" + r.get(4)); // 商品条码 + gd.setProdName("" + r.get(5)); // 商品名称 + gd.setBrandCode("" + r.get(6)); // 品牌代码 + gd.setBrandName("" + r.get(7)); // 品牌名称 + gd.setCategoryb("" + r.get(8)); // 商品大类 + gd.setCategorym("" + r.get(9)); // 商品中类 + gd.setCategorys("" + r.get(10)); // 商品小类 + gd.setCustomerCode("" + r.get(11)); // 客户代码 + gd.setCustomerName("" + r.get(12)); // 客户名称 + gd.setSaleNum("" + r.get(13)); // 销售数量 + gd.setStoreCode("" + r.get(14)); // 销售渠道 + gd.setSalePrice("" + r.get(15)); // 销售价格 + gd.setSaleCost("" + r.get(16)); // 销售成本 + gd.setProfit("" + r.get(17)); // 利润 + gd.setDataDate("" + r.get(18)); // 数据日期 + return gd; + } + + @Override + public void handle(int sheetIndex, long rowIndex, List r) { + if (rowIndex > 0) { //跳过标题行 + String prodCode = "" + r.get(3); //商品编码 + String dataDate = "" + r.get(18); //数据日期 + if (StrUtil.isNotBlank(prodCode)) { //商品编码不为空才插入,过滤掉统计行 + GdWholesaleGd gd = rowToEntity(r); + toInsertListGd.add(gd); + if (gdRescategoryProdService.containsCode(prodCode)) { + GdWholesale gw = new GdWholesale(); + BeanUtil.copyProperties(gd, gw); + toInsertList.add(gw); + y++; + } + x++; + } + } + } + + @Override + public void doAfterAllAnalysed() { + if (toInsertListGd != null && !toInsertListGd.isEmpty()) { + GdWholesaleGd gd = toInsertListGd.get(0); + gdWholesaleGdService.clearByDataDate(gd.getDataDate()); + gdWholesaleGdService.saveBatch(toInsertListGd); + } + if (toInsertList != null && !toInsertList.isEmpty()) { + GdWholesale gd = toInsertList.get(0); + GdWholesaleService.this.clearByDataDate(gd.getDataDate()); + GdWholesaleService.this.saveBatch(toInsertList); + } + + gdlog.setAllNum(x); + gdlog.setValidNum(y); + gdlog.setErrRowNum(errnum); + RowHandler.super.doAfterAllAnalysed(); + } + }; + } + + public void clearByDataDate(String dataDate) { + baseMapper.clearByDataDate(dataDate); + } +} diff --git a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/resources/application-devv.yml b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/resources/application-devv.yml index 6af79e5b..fa82aa6e 100644 --- a/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/resources/application-devv.yml +++ b/yxt_supervise/supervise-portal/supervise-portal-biz/src/main/resources/application-devv.yml @@ -22,9 +22,11 @@ spring: timeout: 0 # 连接超时时间(毫秒) image: - xlsxtmpl: D:/works/projects/javaee/yxtgit/supervise/yxt_supervise/supervise-portal/supervise-portal-biz/target/classes/xlsx-tmpl/ + xlsxtmpl: D:/works/projects/yxt/yxtgit/supervise/yxt_supervise/supervise-portal/supervise-portal-biz/target/classes/xlsx-tmpl/ +# xlsxtmpl: D:/works/projects/javaee/yxtgit/supervise/yxt_supervise/supervise-portal/supervise-portal-biz/target/classes/xlsx-tmpl/ upload: - path: D:/works/projects/javaee/yxtgit/supervise/yxt_supervise/supervise-portal/supervise-portal-biz/target/classes/static/upload/ + path: D:/works/projects/yxt/yxtgit/supervise/yxt_supervise/supervise-portal/supervise-portal-biz/target/classes/static/upload/ +# path: D:/works/projects/javaee/yxtgit/supervise/yxt_supervise/supervise-portal/supervise-portal-biz/target/classes/static/upload/ url: prefix: http://127.0.0.1:7003/upload/ login: