dushibaiyu 6 лет назад
Родитель
Сommit
1c2d7d7fb4

+ 21 - 38
configinfo.cpp

@@ -1,49 +1,18 @@
 #include "configinfo.h"
 
-ConfigInfo::ConfigInfo():m_psetting(nullptr)
+ConfigInfo::ConfigInfo()
 {
-    packId = 1031;
-    Start();
+    //TODO: 小宋,给每个成员设置默认值
 }
 
-ConfigInfo::~ConfigInfo()
-{
-    if(m_psetting)
-        delete  m_psetting;
-}
 
-void ConfigInfo::Start()
-{
-
-//    m_psetting = new QSettings(FileName, QSettings::IniFormat);
-
-    //判断配置文件是否存在
-    QFileInfo fileInfo(FileName);
-    if(!fileInfo.exists()){
-        qDebug()<<"配置文件不存在";
-        QJsonObject obj;
-        obj.insert("baseUrl","http://erp.itwsw.cn/api");
-        obj.insert("printerName","");
-        obj.insert("portName","COM1");
-        obj.insert("portBaudRate",9600);
-        obj.insert("portType",0);
-        obj.insert("savePrinter",true);
-        Set(obj);
-//        return;
-    }
-
-    GetConfig();
-
-}
-
-void ConfigInfo::Set(QJsonObject obj)
-{
-    PQ::ConfigFile::writeObject("Config.json",obj);
-}
-
-void ConfigInfo::GetConfig()
+void ConfigInfo::load()
 {
     QJsonObject obj = PQ::ConfigFile::readObject("Config.json");
+    if(obj.isEmpty()) {
+        save();
+        return;
+    }
     baseUrl = obj.value("baseUrl").toString();
     printerName = obj.value("printerName").toString();
     portName = obj.value("portName").toString();
@@ -51,3 +20,17 @@ void ConfigInfo::GetConfig()
     portType = obj.value("portType").toInt();
     savePrinter = obj.value("savePrinter").toBool();
 }
+
+void ConfigInfo::save()
+{
+    QJsonObject obj;
+    obj.insert("baseUrl","http://erp.itwsw.cn/api");
+    obj.insert("printerName","");
+    obj.insert("portName","COM1");
+    obj.insert("portBaudRate",9600);
+    obj.insert("portType",0);
+    obj.insert("savePrinter",true);
+    PQ::ConfigFile::writeObject("Config.json",obj);
+}
+
+

+ 2 - 20
configinfo.h

@@ -15,8 +15,6 @@ class ConfigInfo
 {
 public:
     ConfigInfo();
-    ~ConfigInfo();
-
     QString baseUrl;//服务器接口地址
     quint16 packId;
     QString printerName; //打印机名称
@@ -26,25 +24,9 @@ public:
 
     bool savePrinter;
 
-//    QString autoPackUrl;//待入库产品添加接口
-
-//    QString loginUrl;//登录接口
-
-//    QString configUrl;//配置接口
-
-//    QString selectValueUrl;//商品列表接口
-
-//    QString levelUrl;//等级列表接口
-
-
 
-    void Set(QJsonObject obj);
-    void GetConfig();
-//    void Init();
-    void Start();
-private:
-    QString FileName = PQ::ConfigFile::configFile("Config.json");
-    QSettings *m_psetting;
+  void load();
+  void save();
 
 };
 

+ 6 - 0
globalinfo.h

@@ -5,6 +5,7 @@
 #include "configinfo.h"
 #include "struct_/projectinfo.h"
 #include <QMap>
+#include "handle/projectinfomanger.h"
 
 struct scaledata{
     double gross_widget = 0.00; //毛重
@@ -29,6 +30,10 @@ public:
     inline void setUser(const UserInfo & users){_users = users;}
     inline const UserInfo & user() const {return _users;}
 
+    inline QMap<QString,QSharedPointer<ProjectInfo>> project() {return _project;}
+    inline QList<QSharedPointer<ProjectInfo>> serverInfo() {return _serverInfo;}
+    inline QList<QSharedPointer<ProjectInfo>> cacheInfo() {return _cacheInfo;}
+
     QString packNum();
 
     scaledata GetScaleData();
@@ -44,6 +49,7 @@ private:
     QMap<QString,QSharedPointer<ProjectInfo>> _project;
     QList<QSharedPointer<ProjectInfo>> _serverInfo;
     QList<QSharedPointer<ProjectInfo>> _cacheInfo;
+    friend class ProjectInfoManger;
 private:
     QString pack_num;
     scaledata scale;

+ 18 - 5
handle/packinfoseed2server.cpp

@@ -1,11 +1,14 @@
 #include "packinfoseed2server.h"
 #include <QTimer>
+#include <QJsonDocument>
 
 PackInfoSeed2Server::PackInfoSeed2Server(PackInfoManger * manger, QObject *parent, bool autoSync) : QObject(parent),
     _manger(manger),_autoSync(autoSync)
 {
     connect(&_requst,&HttpRequest::request,this,&PackInfoSeed2Server::_requst);
-    _failedCount = 0;
+    _netErrorCount = 0;
+    _oneSyncError = 0;
+    log = PQ::PQLogManger::this_()->getLog("PackInfoSeed2Server");
 }
 
 
@@ -30,17 +33,27 @@ void PackInfoSeed2Server::result(int code, const QJsonObject & body)
     if(code != 200 || body.isEmpty()){
         _current.clear();
         QTimer::singleShot(500,this,&PackInfoSeed2Server::doSend);
-        _failedCount ++;
+        _netErrorCount ++;
         return;
     }
     auto error = body.value("code").toInt();
-    if(error == 200){
+    auto message = body.value("message").toString();
+    if(error == 200 || message.indexOf("已存在") >= 0){ // TODO: fix error
         _queue.dequeue();
         _manger->setPackInfoSync(_current->codeSingle(),_current->time(),_autoSync);
         _current.clear();
         QTimer::singleShot(20,this,&PackInfoSeed2Server::doSend);
-        _failedCount = 0;
+        _netErrorCount = 0;
+        _oneSyncError = 0;
     } else {
-        // TODO: 判断错误,根据错误去处理下一步,例如重复了,就next的
+        _oneSyncError ++;
+        if(_oneSyncError > 3){
+            pqWarning(log) << "sync error,and to skip: data : \n" << QJsonDocument(_current->toObject()).toJson() <<
+                              "\n error: \n " <<  QJsonDocument(body).toJson();
+            _oneSyncError = 0;
+            _queue.dequeue();
+        }
+        _current.clear();
+        QTimer::singleShot(20,this,&PackInfoSeed2Server::doSend);
     }
 }

+ 4 - 1
handle/packinfoseed2server.h

@@ -6,6 +6,7 @@
 #include "struct_/packinfo.h"
 #include <QQueue>
 #include "packinfomanger.h"
+#include <pqQtlib/log/pqlog.h>
 // 码单的上传
 class PackInfoSeed2Server : public QObject
 {
@@ -22,12 +23,14 @@ private slots:
     void doSend();
     void result(int code, const QJsonObject & body);
 private:
-    uint _failedCount;
+    uint _netErrorCount;
     QQueue<QSharedPointer<PackInfo>> _queue;
     QSharedPointer<PackInfo> _current;
     PackInfoManger * _manger;
     HttpRequest _requst;
     bool _autoSync;
+    uint _oneSyncError;
+    PQ::PQLog * log;
 };
 
 #endif // PACKINFOSEED2SERVER_H

+ 144 - 2
handle/projectinfomanger.cpp

@@ -1,6 +1,148 @@
-#include "projectinfomanger.h"
+#include "projectinfomanger.h"
+#include <QTimer>
+#include "globalinfo.h"
+#include <QSet>
+#include <pqQtlib/utils/pqfileutils.h>
+#include <QJsonDocument>
 
-ProjectInfoManger::ProjectInfoManger(QObject *parent) : QObject(parent)
+ProjectInfoManger::ProjectInfoManger(PackInfoManger *manger, QObject *parent) : QObject(parent),_manger(manger)
 {
 
 }
+
+bool ProjectInfoManger::loadServerList()
+{
+    if(_status != IDIL) return false;
+    _serverInfo.clear();
+    _cacheInfo.clear();
+    _oneSyncError = 0;
+    _netErrorCount = 0;
+    QTimer::singleShot(0,this,&ProjectInfoManger::doSendLoad);
+    return true;
+}
+
+bool ProjectInfoManger::syncLocalList()
+{
+    if(_status != IDIL) return false;
+    auto  info =  GlobalInfo::this_()->cacheInfo();
+    _serverInfo.clear();
+    _cacheInfo.clear();
+    _pushQueue.clear();
+    for(int i = 0; i < info.size(); ++i){
+        _pushQueue.append(info.at(i));
+    }
+    QTimer::singleShot(0,this,&ProjectInfoManger::syncLocalList);
+    return true;
+}
+
+void ProjectInfoManger::doSendLoad()
+{
+    //TODO:小宋,请求获取批号列表信息
+    // docs: http://doc.vanlai.net:3001/web/#/1?page_id=60
+}
+
+void ProjectInfoManger::doSendCreate()
+{
+    if(!_pushQueue.isEmpty()){
+        _status = Sync_Local_List;
+        QSharedPointer<ProjectInfo> info = _pushQueue.first();
+        // TODO: 小宋, 调用新建批号的接口
+        // docs: http://doc.vanlai.net:3001/web/#/1?page_id=59
+    } else {
+        _status = IDIL;
+        QTimer::singleShot(0,this,&ProjectInfoManger::doSendLoad);
+    }
+}
+
+void ProjectInfoManger::handleList()
+{
+    QSet<QString> remoted;
+    for(int i = 0; i < _serverInfo.size(); ++i){
+        remoted.insert(_serverInfo.at(i)->batch_no);
+    }
+    _cacheInfo.clear();
+    auto list = _manger->getLocalProjectInfo();
+    for(int i = 0; i < list.size(); ++i){
+        auto info = list.at(i);
+        if(!remoted.contains(info->batch_no)){
+            _cacheInfo.append(info);
+        }
+    }
+}
+
+void ProjectInfoManger::result(int code, const QJsonObject & body)
+{
+    switch (_status) {
+    case Load_Server_List:
+        handleGetList(code,body);
+        break;
+    case Sync_Local_List:
+        handlSync(code,body);
+        break;
+    default:
+        break;
+    }
+}
+
+
+void ProjectInfoManger::handlSync(int code, const QJsonObject & body)
+{
+    if(code != 200){
+        _netErrorCount ++;
+        if(_netErrorCount > 3) {
+            emit synced(this,false);
+        } else {
+            QTimer::singleShot(500,this,&ProjectInfoManger::syncLocalList);
+        }
+        return;
+    }
+//    auto error = body.value("code").toInt();
+//    if(error == 200){
+        _pushQueue.dequeue();
+        QTimer::singleShot(50,this,&ProjectInfoManger::syncLocalList);
+//    } else {
+//        _pushQueue.dequeue();
+//        QTimer::singleShot(50,this,&ProjectInfoManger::syncLocalList);
+//    }
+}
+
+void ProjectInfoManger::handleGetList(int code, const QJsonObject & body)
+{
+    if(code != 200){
+        _netErrorCount ++;
+        if(_netErrorCount > 3) {
+            auto dt = PQ::CacheFile::readFile("ProjectInfoList.cache");
+            auto ary = QJsonDocument::fromJson(dt).array();
+            hanldeServerList(ary,false);
+        } else {
+            QTimer::singleShot(500,this,&ProjectInfoManger::syncLocalList);
+        }
+        return;
+    }
+    auto error = body.value("code").toInt();
+    if(error == 200){
+        _oneSyncError = 0;
+        auto ary = body.value("data").toArray();
+        hanldeServerList(ary);
+    } else {
+        _oneSyncError ++;
+        if(_oneSyncError > 3) {
+            auto dt = PQ::CacheFile::readFile("ProjectInfoList.cache");
+            auto ary = QJsonDocument::fromJson(dt).array();
+            hanldeServerList(ary,false);
+        } else {
+            QTimer::singleShot(50,this,&ProjectInfoManger::syncLocalList);
+        }
+    }
+}
+
+void ProjectInfoManger::hanldeServerList(QJsonArray & ary,bool inServer)
+{
+    if(inServer){
+        auto dt = QJsonDocument(ary).toJson();
+        PQ::CacheFile::writeFile("ProjectInfoList.cache",dt);
+    }
+
+    //TODO: 小宋 解析返回的到 _serverInfo
+    // docs: http://doc.vanlai.net:3001/web/#/1?page_id=60
+}

+ 32 - 5
handle/projectinfomanger.h

@@ -3,13 +3,17 @@
 
 #include <QObject>
 #include "httprequest.h"
+#include <QQueue>
+#include "struct_/projectinfo.h"
+#include "packinfomanger.h"
+#include <QJsonArray>
 // 处理批号的管理和同步
 
 class ProjectInfoManger : public QObject
 {
     Q_OBJECT
 public:
-    explicit ProjectInfoManger(QObject *parent = nullptr);
+    explicit ProjectInfoManger(PackInfoManger *manger, QObject *parent = nullptr);
 
     enum ReqStatus
     {
@@ -17,17 +21,40 @@ public:
         Load_Server_List = 1,
         Sync_Local_List = 2
     };
-signals:
 
+    inline QList<QSharedPointer<ProjectInfo>> serverInfo() {return _serverInfo;}
+    inline QList<QSharedPointer<ProjectInfo>> cacheInfo() {return _cacheInfo;}
+
+signals:
+    void inited(ProjectInfoManger * manger, bool inited);
+    void synced(ProjectInfoManger * manger, bool inited);
 public slots:
-    void loadServerList();
+    bool loadServerList();
 
-    void syncLocalList();
+    bool syncLocalList();
 private slots:
-    void loadLocalList();
 
+    void doSendLoad();
+    void doSendCreate();
+    void handleList();
+
+    void result(int code, const QJsonObject & body);
+
+    void handlSync(int code, const QJsonObject & body);
+
+    void handleGetList(int code, const QJsonObject & body);
+
+    void hanldeServerList(QJsonArray & ary,bool inServer = true);
 private:
     ReqStatus _status;
+    QQueue<QSharedPointer<ProjectInfo>> _pushQueue;
+    PackInfoManger * _manger;
+//saveed;
+    QList<QSharedPointer<ProjectInfo>> _serverInfo;
+    QList<QSharedPointer<ProjectInfo>> _cacheInfo;
+
+    uint _oneSyncError;
+    uint _netErrorCount;
 };
 
 #endif // PROJECTINFOMANGER_H

+ 5 - 4
struct_/packinfo.cpp

@@ -60,7 +60,6 @@ BoxInfo::BoxInfo(QSharedPointer<PackInfo> pack,QString code):case_number(code),p
 QJsonObject BoxInfo::toObject()
 {
     QJsonObject ret;
-    //todo: 小宋
     ret.insert("box_weight",box_weight);
     ret.insert("tube_weight",tube_number);
     ret.insert("bucket_weight",bucket_weight);
@@ -80,7 +79,6 @@ QSharedPointer<BoxInfo> BoxInfo::fromObject(QSharedPointer<PackInfo> & pack,QJso
     if(case_number.isEmpty()) return QSharedPointer<BoxInfo>();
     QSharedPointer<BoxInfo> ret(new BoxInfo(pack,""));
     ret->case_number = case_number;
-    // TODO 小宋
     ret->box_weight = obj.value("box_weight").toInt();
     ret->tube_number = obj.value("tube_number").toInt();
     ret->bucket_weight = obj.value("tube_number").toInt();
@@ -91,6 +89,7 @@ QSharedPointer<BoxInfo> BoxInfo::fromObject(QSharedPointer<PackInfo> & pack,QJso
     ret->bucket_color = obj.value("bucket_color").toString();
     ret->sort = obj.value("sort").toString();
     ret->remark = obj.value("remark").toString();
+    ret->parent = pack;
     return ret;
 }
 
@@ -99,7 +98,7 @@ QJsonObject PackInfo::toObject()
     QJsonObject ret;
     ret.insert("time",QString::number(this->time()));
 
-    //todo: 小宋
+    //todo: 小宋 ? _boxes存那里去了?
     ret.insert("quantity",quantity);
     ret.insert("level_id",level_id);
     ret.insert("level",level);
@@ -111,6 +110,8 @@ QJsonObject PackInfo::toObject()
     ret.insert("remark",remark);
     ret.insert("telephone",telephone);
     ret.insert("customer",customer);
+    ret.insert("batch_no",_info->batch_no);
+
     return ret;
 }
 
@@ -125,7 +126,7 @@ QSharedPointer<PackInfo> PackInfo::fromObject(QJsonObject &obj)
     ret->code_single = code_single;
     ret->_time = obj.value("time").toString().toLongLong();
 
-    //todo: 小宋
+    //todo: 小宋, _boxes 从那里取?
     ret->quantity = obj.value("quantity").toInt();
     ret->level_id = obj.value("level_id").toInt();
     ret->level = obj.value("level").toString();